【问题标题】:Storing timestamp values stored in a varchar2 column into a date column in oracle将存储在 varchar2 列中的时间戳值存储到 oracle 中的日期列中
【发布时间】:2018-09-02 13:02:45
【问题描述】:

我在表中有一个列,将时间戳值存储为 “2018-01-12 16:13:51.107000000”,我需要将此列插入到另一个表的日期列中,我必须在这里使用什么格式掩码..

我使用了掩码“YYYY-MM-DD HH24:MI:SS.FF”,但显示“日期格式无法识别”。

【问题讨论】:

  • 第一列是时间戳还是文本?
  • 这是一个文本列@TimBiegeleisen

标签: oracle


【解决方案1】:

我假设您尝试在文本时间戳数据上使用 TO_DATE。这是行不通的,因为 Oracle 日期不存储比秒更精确的任何内容。由于您的时间戳有小数秒,您可以在此处使用TO_TIMESTAMP,然后将该实际时间戳转换为日期:

SELECT
    CAST(TO_TIMESTAMP('2018-01-12 16:13:51.100000',
                      'YYYY-MM-DD HH24:MI:SS.FF') AS DATE)
FROM dual;

12.01.2018 16:13:51

Demo

【讨论】:

  • “你需要使用”太强了。 “你可以使用”会更好。正如我在我的回答中所展示的,一个人不需要需要通过时间戳来获得所需的结果。
【解决方案2】:

可以通过一次调用 TO_DATE() 来完成此操作,但您必须提供正确的格式模型。请注意,此解决方案比转换为时间戳然后转换为日期更简单(并且可能更快 - 如果这很重要)。

如果您希望TO_DATE() 忽略输入字符串的一部分,您可以在格式模型中使用“样板文本”语法。那是用双引号括起来的。例如,如果您的字符串在某处包含字母 T 并且必须被忽略,则您将在格式模型中的相同位置包含“T”。

这有一定的灵活性。在您的情况下,您必须忽略小数点和最多九位小数(Oracle 中时间戳的最大值)。格式模型将允许您使用“.999999999”(或任何其他数字,但大多数程序员使用 9999...)来忽略小数点和之后的最多九位数字。

Demo:(注意格式模型中双引号的“样板文本”)

select to_date('2018-01-12 16:13:51.100000', 
               'YYYY-MM-DD HH24:MI:SS".999999999"') as dt
from   dual;

DT                 
-------------------
2018-01-12 16:13:51

【讨论】:

    猜你喜欢
    • 2017-11-01
    • 1970-01-01
    • 2020-01-14
    • 2014-03-26
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    相关资源
    最近更新 更多