[英]Oracle - Add days/months to a TIMESTAMP WITH TIME ZONE field
我需要将几天(或几个月)动态地添加到现有的带时区的TIMESTAMP中。
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个月?
当您执行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;
分别 NUMTOYMINTERVAL(2, 'MONTH')
。
使用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安装程序 :
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.