当前位置: 首页 > 知识库问答 >
问题:

在Oracle Sql中将夏令时开始和结束时的CST转换为UTC

何嘉运
2023-03-14

选择from_tz(CAST('08-mar-202002.05.02.575000000 am'作为时间戳),'CST')在时区'UTC',从DUAL选择_Daylight_Savings;

从DUAL中选择时区'UTC'处的TO_TIMESTAMP('08-mar-1502.05.02.575000000 am');

但是,我得到的所有这些语句都是相同的错误消息。

*操作:确保指定的字段在datetime或interval中。

它转换所有其他时间只是很好,除了夏令时开始和结束在凌晨2点到3点之间。如果我更改为01:00或03:00,它转换时间戳就可以了。

我尝试了几个解决方案,但似乎没有一个对我有效。

共有1个答案

柯学
2023-03-14

'08-mar-2020 02.05.02.575000000 am'不是时间戳值,而是字符串。

当您希望将字符串转换为时间戳时,您应该始终包含以下格式:

TO_TIMESTAMP('08-MAR-2020 02.05.02.575000000 AM', 'DD-MON-YYYY HH.MI.SS.FF9', 'NLS_DATE_LANGUAGE = american')

如果要创建带有时区的时间戳,则应使用

TO_TIMESTAMP_TZ('08-MAR-2020 02.05.02.575000000 AM ???', 'DD-MON-YYYY HH.MI.SS.FF9 TZR', 'NLS_DATE_LANGUAGE = american')
SELECT tzabbrev, tzname, TZ_OFFSET(tzname) 
FROM V$TIMEZONE_NAMES tz 
where tzabbrev = 'CST'

+--------------------------------------------------------------------------------+
|TZABBREV                       |TZNAME                        |TZ_OFFSET(TZNAME)|
+--------------------------------------------------------------------------------+
|CST                            |America/Atikokan              |-05:00           |
|CST                            |America/Bahia_Banderas        |-05:00           |
|CST                            |America/Belize                |-06:00           |
|CST                            |America/Cambridge_Bay         |-06:00           |
|CST                            |America/Cancun                |-05:00           |
|CST                            |America/Chicago               |-05:00           |
|CST                            |America/Chihuahua             |-06:00           |
|CST                            |America/Coral_Harbour         |-05:00           |
|CST                            |America/Costa_Rica            |-06:00           |
|CST                            |America/Detroit               |-04:00           |
|CST                            |America/El_Salvador           |-06:00           |
|CST                            |America/Fort_Wayne            |-04:00           |
|CST                            |America/Guatemala             |-06:00           |
|CST                            |America/Havana                |-04:00           |
|CST                            |America/Hermosillo            |-07:00           |
|CST                            |America/Indiana/Indianapolis  |-04:00           |
|CST                            |America/Indiana/Knox          |-05:00           |
|CST                            |America/Indiana/Marengo       |-04:00           |
|CST                            |America/Indiana/Petersburg    |-04:00           |
|CST                            |America/Indiana/Tell_City     |-05:00           |
|CST                            |America/Indiana/Vevay         |-04:00           |
|CST                            |America/Indiana/Vincennes     |-04:00           |
|CST                            |America/Indiana/Winamac       |-04:00           |
|CST                            |America/Indianapolis          |-04:00           |
|CST                            |America/Iqaluit               |-04:00           |
|CST                            |America/Kentucky/Louisville   |-04:00           |
|CST                            |America/Kentucky/Monticello   |-04:00           |
|CST                            |America/Knox_IN               |-05:00           |
|CST                            |America/Louisville            |-04:00           |
|CST                            |America/Managua               |-06:00           |
|CST                            |America/Matamoros             |-05:00           |
|CST                            |America/Mazatlan              |-06:00           |
|CST                            |America/Menominee             |-05:00           |
|CST                            |America/Merida                |-05:00           |
|CST                            |America/Mexico_City           |-05:00           |
|CST                            |America/Monterrey             |-05:00           |
|CST                            |America/North_Dakota/Beulah   |-05:00           |
|CST                            |America/North_Dakota/Center   |-05:00           |
|CST                            |America/North_Dakota/New_Salem|-05:00           |
|CST                            |America/Ojinaga               |-06:00           |
|CST                            |America/Pangnirtung           |-04:00           |
|CST                            |America/Rainy_River           |-05:00           |
|CST                            |America/Rankin_Inlet          |-05:00           |
|CST                            |America/Regina                |-06:00           |
|CST                            |America/Resolute              |-05:00           |
|CST                            |America/Swift_Current         |-06:00           |
|CST                            |America/Tegucigalpa           |-06:00           |
|CST                            |America/Thunder_Bay           |-04:00           |
|CST                            |America/Winnipeg              |-05:00           |
|CST                            |Asia/Chongqing                |+08:00           |
+--------------------------------------------------------------------------------+
SYS_EXTRACT_UTC(TO_TIMESTAMP_TZ('08-MAR-2020 02.05.02.575000000 AM ???', 'DD-MON-YYYY HH.MI.SS.FF9 TZR', 'NLS_DATE_LANGUAGE = american'))
TO_TIMESTAMP_TZ('08-MAR-2020 02.05.02.575000000 AM ???', 'DD-MON-YYYY HH.MI.SS.FF9 TZR', 'NLS_DATE_LANGUAGE = american') AT TIME ZONE UTC

如果时间不明确,即夏时制的转换,那么还可以指定它(使用TIMESTAMP文字,因为它更短):

TIMESTAMP '2020-03-08 02.05.02.575 America/Los_Angeles PDT'

参见带有时区数据类型的时间戳

若要消除时间从标准时间切换到夏时制时边界情况的歧义,请同时使用TZR格式元素和相应的TZD格式元素。TZD格式元素是包含夏时制信息的时区区域的缩写。例如美国太平洋标准时间的PST和美国太平洋夏时制的PDT。以下规范确保返回夏时制时间值:

TIMESTAMP '1999-10-29 01:30:00 America/Los_Angeles PDT'
 类似资料:
  • 在我的一个项目中,我必须将UTC DateTime转换为用户特定的日期和时间。我正在使用xml获取时间偏移量和夏令时参数。 例如offset=“GMT+2”dst=“true” 谢谢,

  • 看来我星期一早上有个案子!!! 正如你们所能看到的,我的本地机器位于东部时区,日光节约已经生效。这可以从下面的“日期”命令中看到。 然后我使用php生成了一个unix时间戳。它应该给出您当前的时间并在1970年1月1日的UTC 0:0:0将其转换为Unix纪元。 我的mysql会话被设置为UTC,我想象1460992469表示为mktime转换为UTC。 问题是转换回est不承认夏令时。谁能帮我指

  • 我做了下面的代码,但我知道它是正确的或不是,请协助我做正确的方式时区转换。 我把UTC日期作为json字符串,转换成用户的时区格式,并显示Android端

  • 我想从JavaGUI到数据库获取startTime和endTime的值。 电脑座位班 Cobadatabase类 这里的问题是,当单击登录按钮时,开始时间显示在我的数据库中的开始时间和结束时间列上。当单击注销按钮时,将在数据库中创建另一个行,该行在starTime和endTime列上都包含endTime。我想知道为什么会这样...

  • 使用以下代码: 我得到 有没有办法从夏时制之后到1:00:00而不经过夏时制之前的1:00:00?