繁体   English   中英

Oracle-将天/月添加到带时区的时间戳字段中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM