Oracleでタイムスタンプ値に月を追加するにはどうすればよいですか? 私のクエリでは、代わりに日付値に変換されています:
SELECT add_months(current_timestamp,2)
FROM dual;
実際の出力は次のとおりです。
ADD_MONTH
11-MAR-13
予想される出力は次のとおりです。
2013-01-01 00:00:00.000000000+00:00
Oracleでタイムスタンプ値に月を追加するにはどうすればよいですか? 私のクエリでは、代わりに日付値に変換されています:
SELECT add_months(current_timestamp,2)
FROM dual;
実際の出力は次のとおりです。
ADD_MONTH
11-MAR-13
予想される出力は次のとおりです。
2013-01-01 00:00:00.000000000+00:00
オラクルの場合:
SELECT
TIMESTAMP'2014-01-30 08:16:32', -- TS we want to increase by 1 month
--TIMESTAMP'2014-01-30 08:16:32' + NUMTOYMINTERVAL(1, 'MONTH'), -- raises ORA-01839: date not valid for month specified
--TIMESTAMP'2014-01-30 08:16:32' + INTERVAL '1' MONTH, -- raises ORA-01839: date not valid for month specified
ADD_MONTHS(TIMESTAMP'2014-01-30 08:16:32', 1), -- works but is a date :(
CAST(ADD_MONTHS(TIMESTAMP'2014-01-30 08:16:32', 1) AS TIMESTAMP) -- works
FROM DUAL
これにより、日付と時刻TIMESTAMP
がデータ型として表示されます。
select TO_TIMESTAMP(TO_CHAR(ADD_MONTHS(SYSDATE, 2), 'YYYYMMDD HH24:MI'),
'YYYYMMDD HH24:MI') from dual;
上記よりも多かれ少なかれ精度 (EG 丸め) が必要な場合は、日付形式を調整します (両方とも同じ形式である必要があります)。たとえば、これは 2 か月を秒レベルの精度で返します。
select TO_TIMESTAMP(TO_CHAR(ADD_MONTHS(SYSTIMESTAMP, 2),
'YYYYMMDD HH24:MI:SS'), 'YYYYMMDD HH24:MI:SS') from dual;
これは、必要な形式に(文字として)取得できる最も近いものです。
select TO_CHAR(
TO_TIMESTAMP(TO_CHAR(ADD_MONTHS(SYSTIMESTAMP, 2),
'YYYYMMDD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS'),
'YYYY-MM-DD HH24:MI:SS.FF TZR') from dual;
私はこれがあなたが探しているものをあなたに与えると思います:
SELECT TO_CHAR(TO_TIMESTAMP(ADD_MONTHS(CURRENT_TIMESTAMP,2))
+ (CURRENT_TIMESTAMP - TRUNC(CURRENT_TIMESTAMP)),
'YYYY-MM-DD HH:MI:SSxFFTZR') FROM DUAL;
間隔メソッドを使用する際の問題は、クエリを実行する日付によっては予期しないエラーが発生する可能性があることです。例えば
SELECT TO_TIMESTAMP('31-JAN-2012') + NUMTOYMINTERVAL(1,'MONTH') FROM DUAL;
そのクエリは次を返します。
ORA-01839: date not valid for month specified
これは、有効な日付ではない 2 月 31 日を返そうとするためです。
ADD_MONTHS は日付計算の「より安全な」方法です。間隔クエリがエラーをスローする場合、ADD_MONTHS は上記の例の月の最後の日付 (年によって 2 月 28 日または 29 日) を返します。
SELECT current_timestamp + INTERVAL '2' MONTH from dual;
これを目的の形式で表示するには、次を使用しますTO_CHAR
。
SELECT TO_CHAR(current_timestamp + INTERVAL '2' MONTH,
'YYYY-MM-DD HH24:MI:SS.FF9TZH:TZM') from dual;
2013-03-11 23:58:14.789501000+01:00
オラクルの場合:
select TO_TIMESTAMP(Sysdate,'DD-Mon-YYYY HH24-MI-SS') + 60
from dual;
select sysdate + interval '2' month from dual;
select TO_TIMESTAMP (Sysdate + interval '2' month, 'DD-Mon-YYYY HH24-MI-SS')
from dual
;
結果1:
| TO_TIMESTAMP(SYSDATE,'DD-MON-YYYYHH24-MI-SS')+60 |
----------------------------------------------------
| March, 12 0013 00:00:00+0000 |
結果 2:
| SYSDATE+INTERVAL'2'MONTH |
--------------------------------
| March, 11 2013 21:41:10+0000 |
結果3:
| TO_TIMESTAMP(SYSDATE+INTERVAL'2'MONTH,'DD-MON-YYYYHH24-MI-SS') |
------------------------------------------------------------------
| March, 11 0013 00:00:00+0000 |