2016-03-03 97 views
0

我需要動態地將某些天(或幾個月)添加到現有TIMESTAMP WITH TIME ZONE字段。Oracle - 將日/月添加到TIMESTAMP WITH TIME ZONE字段

select DATED from MY_TABLE where ID = 1165; 

給出:

DATED 
--------------------------------------------------------------------------- 
20-FEB-16 04.31.54 AM EUROPE/MOSCOW 

當我運行:

UPDATE MY_TABLE SET DATED = DATED + 2 WHERE ID = 1165; 

它給:

DATED 
--------------------------------------------------------------------------- 
22-FEB-16 04.31.54 AM +03:00 

因此,如何適當加2天,不丟失時間戳「 EUROPE/MOSCOW「

如何以與天相同的方式添加2個月?

回答

3

當你這樣做DATED = DATED + 2,然後是DATED隱式轉換爲DATE值(不具有任何時區信息),然後使用您的當前會話的時區設置轉換回TIMESTAMP WITH TIME ZONE值。

嘗試

UPDATE MY_TABLE SET DATED = DATED + INTERVAL '2' DAY WHERE ID = 1165; 

UPDATE MY_TABLE SET DATED = DATED + 2 * INTERVAL '1' DAY WHERE ID = 1165; 

UPDATE MY_TABLE SET DATED = DATED + NUMTODSINTERVAL(2, 'day') WHERE ID = 1165; 

爲了加2月份,您可以使用

UPDATE MY_TABLE SET DATED = DATED + INTERVAL '2' MONTH WHERE ID = 1165; 

resp。例如,NUMTOYMINTERVAL(2, 'MONTH')

+0

+ INTERVAL '2' DAY給出錯誤ORA-30089:丟失或無效<日期時間字段> – Alexander

+0

NUMTODSINTERVAL( 2,'day')有效,但MONTH參數不適用於NUMTODSINTERVAL函數(僅限日,時,分,秒).. – Alexander

+0

這就是爲什麼我也寫了'NUMTOYMINTERVAL(2,'MONTH')' –

2

使用INTERVAL添加個月的問題是,如果沒有足夠的天所產生的一個月會引發錯誤:

SELECT TIMESTAMP '2016-01-30 00:00:00.000' AT TIME ZONE 'UTC' 
     + INTERVAL '1' MONTH 
FROM DUAL; 

給出:

ORA-01839: date not valid for month specified 

然而,你可以寫一個簡單的(ish)函數來執行算術運算:

Oracle Setup

CREATE OR REPLACE FUNCTION TS_ADD_MONTHS(
    datetime TIMESTAMP WITH TIME ZONE, 
    months INT 
) RETURN TIMESTAMP WITH TIME ZONE DETERMINISTIC 
AS 
    p_tz CONSTANT VARCHAR2(30) := EXTRACT(TIMEZONE_REGION FROM datetime); 
    p_utc CONSTANT TIMESTAMP := datetime AT TIME ZONE 'UTC'; 
    p_date CONSTANT DATE   := TRUNC(p_utc); 
BEGIN 
    RETURN CAST(ADD_MONTHS(p_date, months) AS TIMESTAMP WITH TIME ZONE) AT TIME ZONE p_tz + (p_utc - p_date); 
END; 
/
SHOW ERRORS; 

查詢

SELECT TS_ADD_MONTHS(
     TIMESTAMP '2016-01-30 12:12:12.012 EST', 
     1 
     ) AS datetime 
FROM DUAL; 

輸出

DATETIME 
-------------------------------- 
29-FEB-16 12.12.12.012000000 EST 
+1

@AlexPoole更新並同時製作了'DETERMINISTIC' – MT0

相關問題