oracle 如何在时间戳中添加一个月的时区值,同时保持完全相同的小时

a7qyws3x  于 2023-04-20  发布在  Oracle
关注(0)|答案(1)|浏览(238)

我有一个TIMESTAMP WITH TIME ZONE类型的PL/SQL变量,我想给它的值加上一个月,但特别是当从夏令时改为标准时间时,时间应该保持不变。
下面的SELECT(虽然不是PLS/SQL)显示了这个问题:

WITH
   data
   AS
      (    SELECT TO_TIMESTAMP_TZ('2023-04-17 05:00:00 EUROPE/BERLIN', 'yyyy-mm-dd hh24:mi:ss tzr') + NUMTOYMINTERVAL(LEVEL, 'MONTH') AS ts
             FROM DUAL
       CONNECT BY LEVEL <= 7)
SELECT to_char(ts, 'yyyy-mm-dd hh24:mi:ss tzr') AS ts
  FROM data;

这个返回

2023-05-17 05:00:00 Europe/Berlin
2023-06-17 05:00:00 Europe/Berlin
2023-07-17 05:00:00 Europe/Berlin
2023-08-17 05:00:00 Europe/Berlin
2023-09-17 05:00:00 Europe/Berlin
2023-10-17 05:00:00 Europe/Berlin
2023-11-17 04:00:00 Europe/Berlin

如你所见,时间在11月变成了4点。
Oracle中是否有一个函数可以添加一个月而不更改时间?

dm7nw8vv

dm7nw8vv1#

你可以试试这个:

FROM_TZ(
   CAST(
      TO_TIMESTAMP_TZ('2023-04-17 05:00:00 EUROPE/BERLIN', 'yyyy-mm-dd hh24:mi:ss tzr') AS TIMESTAMP
   ) + NUMTOYMINTERVAL(LEVEL, 'MONTH'),
   'Europe/Berlin'
)

CAST(... AS TIMESTAMP)删除时区(和DST)信息,然后添加月份,然后再次使用FROM_TZ附加时区

相关问题