我正在尝试将以下字符串值转换为TO_DATE,但oracle不是 识别日期格式。我要去哪里错了。
SELECT TO_DATE('Wed Oct 10 23:50:00 2018 UTC','Dy Mon DD HH24:MI:SS YYYY TZR','NLS_DATE_LANGUAGE = American')
FROM dual;
第1行出现错误:
ORA-01821:日期格式无法识别
答案 0 :(得分:3)
使用:
SELECT TO_TIMESTAMP_TZ('Wed Oct 10 23:50:00 2018 UTC','DY MON DD HH24:MI:SS YYYY TZR','NLS_DATE_LANGUAGE=American')
FROM dual;
TO_DATE函数返回DATE数据类型,该数据类型不支持时区。您在查询(时区区域)中使用TZR
格式说明符,由于DATE不支持此操作,因此会产生错误。
This documentation - Time Zones显示哪些数据类型支持时区,并指出只有TIMESTAMP WITH TIME ZONE
和TIMESTAMP WITH LOCAL TIME ZONE
支持。因此,您必须转换为此数据类型之一,而不是转换为DATE。
TO_TIMESTAMP_TZ函数将文字转换为TIMESTAMP WITH TIME ZONE
数据类型。
答案 1 :(得分:1)
如果(并且我意识到这是一个很大的'if')字符串值始终包含UTC而不包含任何其他时区值,那么您可以将其视为character literal。为此,您可以将格式模型从TZR
无法识别的to_date()
更改为"UTC"
-包括双引号:
SELECT TO_DATE('Wed Oct 10 23:50:00 2018 UTC',
'Dy Mon DD HH24:MI:SS YYYY "UTC"',
'NLS_DATE_LANGUAGE = American')
FROM dual;
TO_DATE('WEDOCT1023
-------------------
2018-10-10 23:50:00
当然,由于那是一个纯日期,它仍然没有时区信息,但是如果要保留该日期,则无论如何都需要使用[local]时区数据类型的时间戳。