2016-12-05 9 views
0

を表示しません、私は時間と日付から間隔を引く:Oracleのフォーマットを指定してTO_DATEは、私は単純な計算を持っている時間

select TO_DATE('2016-12-05 23:04:59', 'YYYY-MM-DD HH24:MI:SS') - to_dsinterval('00 0:05:00') from dual; 

それは正常に動作し、結果:2016年12月5日午前22時59分59秒

タイムゾーンでは正しく動作しないため、次の方法ではタイムゾーンの問題を解決します。もう一度to_date()で式をラップするだけです。

select TO_DATE(
TO_DATE('2016-12-05 23:04:59', 'YYYY-MM-DD HH24:MI:SS') - to_dsinterval('00 0:05:00')) from dual; 

今は時間がゼロに変わります。結果は次のようになります。2016年12月5日夜10時59分59秒実際:2016年12月5日午前0時00分〇​​〇秒

私はこのように、外TO_DATEにフォーマットを追加する場合:

select to_date(TO_DATE('2016-12-05 23:04:59', 'YYYY-MM-DD HH24:MI:SS') - to_dsinterval('00 0:05:00'), 'YYYY-MM-DD HH24:MI:SS') from dual; 

結果は非常に奇妙になる:私が間違ってやっている何0005-12-16午後12時00分○○秒

+1

結果は、すでに日付です。別の 'to_date()'は必要なく、これはタイムゾーンの問題を解決しません。タイムゾーンで何らかの操作をしたい場合は、 'timestamp at time zone'を使用してください。 – Kacper

答えて

0

TO_DATE(char, fmt, nls)は、引数がVARCHAR2である。それは、その後に、このバックに変換(暗黙のうちにこのキャストを実行するためにTO_CHAR(value, NLS_DATE_FORMAT)を呼び出す)引数の予想されるデータ型と一致するようTO_DATE('2016-12-05 23:04:59', 'YYYY-MM-DD HH24:MI:SS') - to_dsinterval('00 0:05:00')を実行

VARCHAR2データ型にキャストされますあなたはTO_DATE()オラクルに渡しDATEデータ型を返します。 DATEデータ型。

あなただけ実行する必要があります。

SELECT TO_DATE('2016-12-05 23:04:59', 'YYYY-MM-DD HH24:MI:SS') 
     - to_dsinterval('00 0:05:00') 
FROM DUAL; 

あなたはタイムゾーンを処理したい場合は、TIMESTAMP AT TIME ZONEを使用し、ちょうどあなたが日付を格納したいものは何でもタイムゾーンに変換します

SELECT TIMESTAMP '2016-12-05 23:04:59 Europe/Paris' AT TIME ZONE 'UTC' 
FROM DUAL; 

(パリのタイムゾーンでタイムスタンプを作成し、UTCタイムゾーンで正しいタイムに変換します)。

0

DATEデータ型ではタイムゾーン機能がサポートされていないため、TIMESTAMP WITH TIME ZONEを使用する必要があります。

あなたのクエリ

SELECT TO_DATE(TO_DATE('2016-12-05 23:04:59', 'YYYY-MM-DD HH24:MI:SS') - TO_DSINTERVAL('00 0:05:00'), 'YYYY-MM-DD HH24:MI:SS') 
FROM dual; 

には、以下のん:

  1. DATE '2016年12月5日23時04分59秒'
  2. 減算間隔'00午後12時05分00' 秒を作成します。
  3. VARCHAR2にキャストする(フォーマットを使用)
  4. キャストDATE場合YYYY-MM-DD HH24:MI:SS形式

を使用してNLS_DATE_FORMATこのクエリは正しい出力を返しYYYY-MM-DD HH24:MI:SSに等しくなります。

SELECT TO_TIMESTAMP('2016-12-05 23:04:59', 'YYYY-MM-DD HH24:MI:SS') - TO_DSINTERVAL('00 0:05:00') 
FROM dual; 

TO_DATE(...も同様に動作します。この1

使用。時間帯のサポートが必要な場合は、次の操作を実行する必要があります。

SELECT TO_TIMESTAMP_TZ('2016-12-05 23:04:59 Europe/Berlin', 'YYYY-MM-DD HH24:MI:SS TZR') - TO_DSINTERVAL('00 0:05:00') 
FROM dual; 
+0

' DATE' dataypesは 'INTERVAL DAY TO SECOND'算術演算を実行できます。 'DUALを選択する(TO_DATE( '2016-12-05 23:04:59'、 'YYYY-MM-DD HH24:MI:SS') - TO_DSINTERVAL('00 0:05:00 '))FROM DUAL 'は' DATE'データ型である 'Typ = 13'を返しますので、' TIMESTAMP'への暗黙のキャストはありません。 – MT0

+0

あなたが正しいです、私は私の答えを修正しました。 –

関連する問題