首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >夏令时错误

夏令时错误
EN

Stack Overflow用户
提问于 2018-04-24 14:46:43
回答 1查看 102关注 0票数 1

我想计算不同时区的终止日期之间的时间差。我正在将这两次时间转换为格林威治时间。但是,当我在Europe/Moscow时区转换日期时,偏移量是不同的,尽管没有夏令时。

这是我检查过的案例:

代码语言:javascript
复制
SELECT TO_DATE('5/20/2018 10:05:00 PM','mm/dd/yyyy hh:mi:ss am'),
       TO_DATE('5/20/2018 10:05:00 PM','mm/dd/yyyy hh:mi:ss am') 
             - extract(TIMEZONE_HOUR from from_tz (TO_TIMESTAMP('5/20/2018 10:05:00 PM','mm/dd/yyyy hh:mi:ss am') ,'GMT' ) at time zone 'Europe/Moscow')/24 deptime_GRINICH
from dual
UNION
SELECT TO_DATE('5/24/2018 11:35:00 PM','mm/dd/yyyy hh:mi:ss am'),
       TO_DATE('5/24/2018 11:35:00 PM','mm/dd/yyyy hh:mi:ss am') 
             - extract(TIMEZONE_HOUR from  from_tz (TO_TIMESTAMP('5/24/2018 11:35:00 PM','mm/dd/yyyy hh:mi:ss am') ,'GMT' ) at time zone 'Europe/Moscow')/24 deptime_GRINICH
from dual

结果是:

代码语言:javascript
复制
Date                         date converting to Greenwich time zone
5/20/2018 10:05:00 PM        5/20/2018 6:05:00 PM   --> hour difference  4 hours
5/24/2018 7:35:00 PM         5/24/2018 3:35:00 PM   --> hour difference  4 hours

但2018年时区-索契是UTC +3小时

EN

回答 1

Stack Overflow用户

发布于 2018-04-24 16:02:11

2014年10月,俄罗斯改变了他们的夏令时规则。Oracle数据库中的时区文件可能是不包含最近更改的旧文件。验证版本

代码语言:javascript
复制
SELECT * FROM V$TIMEZONE_FILE;

并考虑升级,请参阅Upgrading the Time Zone File and Timestamp with Time Zone Data

然而,这似乎是Oracle中的一个错误。看一下我的查询,它比您的示例更清楚一些:

代码语言:javascript
复制
SELECT *
FROM NLS_SESSION_PARAMETERS
WHERE parameter LIKE 'NLS_TIMESTAMP_TZ_FORMAT';

PARAMETER                  VALUE                  
-------------------------- --------------------------------------
NLS_TIMESTAMP_TZ_FORMAT    YYYY-MM-DD HH24:MI:SSfmXFF3 fmTZH:TZM                                      

1 row selected.


SELECT 
    EXTRACT(TIMEZONE_HOUR FROM TIMESTAMP '2018-05-20 22:05:00 Europe/Moscow') AS TZ_HOUR, 
    TO_CHAR(TIMESTAMP '2018-05-20 22:05:00 Europe/Moscow', 'YYYY-MM-DD HH24:MI:SS TZH:TZM') AS ts2,
    TIMESTAMP '2018-05-20 22:05:00 Europe/Moscow' AS ts3
FROM dual;

   TZ_HOUR TS2                            TS3            
---------- ------------------------------ ----------------------------------
         4 2018-05-20 22:05:00 +04:00     20.05.2018 22:05:00.000000000 +03:00        

1 row selected.

这真的很奇怪,因为TZH:TZM,resp。EXTRACT(TIMEZONE_HOUR FROM ...)返回的值与默认NLS_TIMESTAMP_TZ_FORMAT = ... TZH:TZM不同。对于其他时区(例如Europe/Zurich),我总是得到02:00 -正如预期的那样。

您可以在Oracle support上开具票证。

我有两个数据库,一个旧的,一个新的。旧的没有反映俄罗斯夏令时的最新变化,新的反映了。但是,上面的错误出现在这两个服务器上:

代码语言:javascript
复制
ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT = 'YYYY-MM-DD HH24:MI:SS TZH:TZM';

SELECT filename, VERSION,
    TO_CHAR(TIMESTAMP '2018-05-20 22:05:00 Europe/Moscow', 'TZH:TZM TZD') AS ts1,
    TIMESTAMP '2018-05-20 22:05:00 Europe/Moscow' AS ts2,
    TO_CHAR(TIMESTAMP '2018-01-20 22:05:00 Europe/Moscow', 'TZH:TZM TZD') AS ts3,
    TIMESTAMP '2018-01-20 22:05:00 Europe/Moscow' AS ts4
FROM V$TIMEZONE_FILE;



Old (Daylight-Saving times still existing due to old timezlrg_14.dat file):

FILENAME          VERSION  TS1          TS2                                    TS3           TS4
----------------  -------- -----------  ------------------------------------   -----------   -------------------------------------
timezlrg_14.dat   14       +04:00 MSD   20.05.2018 22:05:00.000000000 +03:00   +03:00 MSK    20.01.2018 22:05:00.000000000 +03:00

New (no Daylight-Saving time changes):

FILENAME          VERSION  TS1          TS2                                    TS3           TS4
----------------  -------- -----------  ------------------------------------   -----------   -------------------------------------
timezlrg_18.dat   18       +04:00 MSK   20.05.2018 22:05:00.000000000 +03:00   +04:00 MSK    20.01.2018 22:05:00.000000000 +03:00
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49995050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档