varchar2字符串为Date格式

时间:2018-10-17 15:42:29

标签: sql oracle

我正在尝试将以下字符串值转换为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:日期格式无法识别

2 个答案:

答案 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 ZONETIMESTAMP 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]时区数据类型的时间戳。