'08-MAR-2020 02.05.02.575000000 AM' 不是TIMESTAMP 值,它是一个字符串。
当您想将字符串转换为 TIMESTAMP 时,您应该始终包含以下格式:
TO_TIMESTAMP('08-MAR-2020 02.05.02.575000000 AM', 'DD-MON-YYYY HH.MI.SS.FF9', 'NLS_DATE_LANGUAGE = american')
如果你想创建一个TIMESTAMP WITH TIME ZONE,那么你应该使用
TO_TIMESTAMP_TZ('08-MAR-2020 02.05.02.575000000 AM ???', 'DD-MON-YYYY HH.MI.SS.FF9 TZR', 'NLS_DATE_LANGUAGE = american')
我不知道CST是什么意思,很模棱两可:
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 |
+--------------------------------------------------------------------------------+
一旦您有了 UTC,您就可以转换为 UTC:
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'
见TIMESTAMP WITH TIME ZONE Data Type
消除时间切换时边界情况的歧义
从标准时间到夏令时,同时使用 TZR 格式
元素和相应的 TZD 格式元素。 TZD 格式
element 是带Daylight的时区区域的缩写
包括节省时间信息。例如美国太平洋地区的 PST
美国太平洋夏令时间的标准时间和 PDT。下列
规范确保返回夏令时值:
TIMESTAMP '1999-10-29 01:30:00 America/Los_Angeles PDT'
如果不添加 TZD 格式元素,则 datetime 值为
模棱两可,然后 Oracle 数据库返回一个错误,如果你有
ERROR_ON_OVERLAP_TIME 会话参数设置为 TRUE。如果
ERROR_ON_OVERLAP_TIME 设置为 FALSE(默认值),然后 Oracle
数据库将不明确的日期时间解释为标准时间。