Oracle 10gでこのSQLを実行した後:
SELECT SYSDATE, CURRENT_TIMESTAMP FROM DUAL
私はこの奇妙な出力を受け取ります:
時間差の原因は何ですか?サーバー時間がSYSDATE値と等しい
CURRENT_DATE
および CURRENT_TIMESTAMP
は、セッションのタイムゾーンで現在の日付と時刻を返します。
SYSDATE
および SYSTIMESTAMP
は、システムの日付と時刻、つまりデータベースが存在するシステムの日付と時刻を返します。
クライアントセッションがデータベースが存在するサーバーと同じタイムゾーンにない場合(または、NLS設定を介してとにかくそうではないと言う場合)、SYS*
関数とCURRENT_*
関数を混在させると、異なる値が返されます。それらはすべて正しいもので、異なるものを表しているだけです。サーバーは+4:00のタイムゾーンにある(またはそのように思われている)ように見えますが、クライアントセッションは+4:30のタイムゾーンにあります。
また、クロックが同期されていない場合は、時間にわずかな違いが見られる場合がありますが、これはここでは問題にならないようです。
SYSDATE
、SYSTIMESTAMP
はデータベースの日付とタイムスタンプを返しますが、current_date
、current_timestamp
は作業場所の日付とタイムスタンプを返します。
例えばインドから働いて、私はパリにあるデータベースにアクセスします。午後4:00 IST:
select sysdate,systimestamp from dual;
これにより、パリの日付と時刻が返されます。
結果
12-MAY-14 12-MAY-14 12.30.03.283502000 PM +02:00
select current_date,current_timestamp from dual;
これにより、インドの日付と時刻が返されます。
結果
12-MAY-14 12-MAY-14 04.00.03.283520000 PM ASIA/CALCUTTA
3:30の時差に注意してください。
SYSDATEは、データベースが存在するシステムのシステム日付を返します
CURRENT_TIMESTAMPは、データ型TIMESTAMP WITH TIME ZONEの値で、セッションタイムゾーンの現在の日付と時刻を返します。
このコマンドを実行します
ALTER SESSION SET TIME_ZONE = '+3:0';
同じ結果が得られます。
SYSDATE
は、サーバーの日付と時刻を提供します。CURRENT_DATE
は、クライアントの日付と時刻を提供します(つまり、システム)CURRENT_TIMESTAMP
は、クリネットのデータとタイムスタンプを提供します。注:SYSDATE-日付のみを返します。つまり、「yyyy-mm-dd」は正しくありません。 SYSDATEは、時間、分、秒を含むデータベースサーバーのシステム日付を返します。例えば:
デュアルからSYSDATEを選択します。次のような出力が返されます:12/15/2017 12:42:39 PM