web-dev-qa-db-ja.com

Oracleの異なるCURRENT_TIMESTAMPとSYSDATE

Oracle 10gでこのSQLを実行した後:

SELECT SYSDATE, CURRENT_TIMESTAMP  FROM DUAL

私はこの奇妙な出力を受け取ります: Toad output for query

時間差の原因は何ですか?サーバー時間がSYSDATE値と等しい

44
Mohsen Kashi

CURRENT_DATE および CURRENT_TIMESTAMP は、セッションのタイムゾーンで現在の日付と時刻を返します。

SYSDATE および SYSTIMESTAMP は、システムの日付と時刻、つまりデータベースが存在するシステムの日付と時刻を返します。

クライアントセッションがデータベースが存在するサーバーと同じタイムゾーンにない場合(または、NLS設定を介してとにかくそうではないと言う場合)、SYS*関数とCURRENT_*関数を混在させると、異なる値が返されます。それらはすべて正しいもので、異なるものを表しているだけです。サーバーは+4:00のタイムゾーンにある(またはそのように思われている)ように見えますが、クライアントセッションは+4:30のタイムゾーンにあります。

また、クロックが同期されていない場合は、時間にわずかな違いが見られる場合がありますが、これはここでは問題にならないようです。

74
Alex Poole

SYSDATESYSTIMESTAMPはデータベースの日付とタイムスタンプを返しますが、current_datecurrent_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の時差に注意してください。

18

SYSDATEは、データベースが存在するシステムのシステム日付を返します

CURRENT_TIMESTAMPは、データ型TIMESTAMP WITH TIME ZONEの値で、セッションタイムゾーンの現在の日付と時刻を返します。

このコマンドを実行します

    ALTER SESSION SET TIME_ZONE = '+3:0';

同じ結果が得られます。

3
Harshit
  • SYSDATEは、サーバーの日付と時刻を提供します。
  • CURRENT_DATEは、クライアントの日付と時刻を提供します(つまり、システム)
  • CURRENT_TIMESTAMPは、クリネットのデータとタイムスタンプを提供します。
1
reddy

注:SYSDATE-日付のみを返します。つまり、「yyyy-mm-dd」は正しくありません。 SYSDATEは、時間、分、秒を含むデータベースサーバーのシステム日付を返します。例えば:

デュアルからSYSDATEを選択します。次のような出力が返されます:12/15/2017 12:42:39 PM

0
Amir Abe