【问题标题】:varchar2 string to Date formatvarchar2 字符串转日期格式
【发布时间】:2019-03-22 08:42:20
【问题描述】:

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

【问题讨论】:

标签: sql oracle


【解决方案1】:

用途:

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 数据类型。

【讨论】:

  • 谢谢。这样可行。如何获取上述格式的 2 个日期的 HH:MI:SS 格式的时差:例如'Wed Oct 10 23:50:00 2018 UTC'-'Wed Oct 07 23:50:00 2018 UTC'跨度>
  • @user3444050 - 将它们都转换为带有时区的时间戳,如图所示,然后减去它们(以获得间隔),或者如果它们总是在同一个 TZ 中,则转换为日期并减去那些(获得天数)。 This answer 有一些指针可以找到所需格式的差异,无论您以哪种方式进行减法。
【解决方案2】:

如果(我意识到这是一个很大的“如果”)字符串值始终包含 UTC 而不是任何其他时区值,那么您可以将其视为character literal。您可以通过将格式模型从to_date() 无法识别的TZR 更改为"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

当然,因为这是一个普通日期,它仍然没有时区信息,但如果你想保留它,那么无论如何你都需要一个具有 [本地] 时区数据类型的时间戳。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-03
    • 2018-08-30
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多