简体   繁体   English

Oracle SQL:获取给定日期的时区

[英]Oracle SQL: get timezone for a given date

How can the timezone be determined accurately for a given date (DATE data_type column) based on the following information? 如何根据以下信息准确确定给定日期(DATE data_type列)的时区?

a) DATE columns do not store timezone information. a)DATE列不存储时区信息。

b) Server timezone is either EST or EDT depending on whether date light saving is in effect or not b)服务器时区是EST或EDT,具体取决于日期光节省是否有效

c) The current timezone offset can be easily fetched by SQL: c)SQL可以轻松获取当前时区偏移量:

SELECT TO_CHAR(SYSTIMESTAMP,'TZH:TZM') FROM DUAL

Assuming that timezone for today (3-Nov-2014) is EST, how can we determine what was the timezone in effect (ie EST or EDT) for a given date (eg 21-Oct-2014) programatically? 假设今天(2014年11月3日)的时区是EST,我们如何以编程方式确定给定日期(例如2014年10月21日)的有效时区(即EST或EDT)?

Oracle has support for IANA time zones . Oracle支持IANA时区 The US Eastern time zones is represented by "America/New_York" . 美国东部时区由"America/New_York"代表。

You can use FROM_TZ to create a TIMESTAMP WITH TIME ZONE from a TIMESTAMP value. 您可以使用FROM_TZTIMESTAMP值创建TIMESTAMP WITH TIME ZONE (If you're starting from DATE then you should first cast to TIMESTAMP .) (如果你是从DATE开始那么你应该先投射到TIMESTAMP 。)

Then you can use TO_CHAR with either 'TZH:TZM' to get an offset, or with 'TZD' to get an abbreviation (such as EST or EDT). 然后你可以使用TO_CHAR'TZH:TZM'来获得偏移,或者使用'TZD'来获得缩写(例如EST或EDT)。

For example: 例如:

SELECT TO_CHAR(FROM_TZ(TIMESTAMP '2014-11-02 00:00:00', 'America/New_York'),'TZD')
FROM DUAL;  -- Output: 'EDT'

SELECT TO_CHAR(FROM_TZ(TIMESTAMP '2014-11-02 00:00:00', 'America/New_York'),'TZH:TZM')
FROM DUAL;  -- Output: '-04:00'

SELECT TO_CHAR(FROM_TZ(TIMESTAMP '2014-11-03 00:00:00', 'America/New_York'),'TZD')
FROM DUAL;  -- Output: 'EST'

SELECT TO_CHAR(FROM_TZ(TIMESTAMP '2014-11-03 00:00:00', 'America/New_York'),'TZH:TZM')
FROM DUAL;  -- Output: '-05:00'

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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