【问题标题】:How to use to_date for date like '1970-01-01 00:00:01.0'如何使用 to_date 作为日期,如“1970-01-01 00:00:01.0”
【发布时间】:2019-05-27 14:20:33
【问题描述】:

我想使用 to_date 将文本 '1970-01-01 00:00:01.0' 转换为日期,但我不知道应该使用哪种格式。

如果您查看以下示例: to_date('1970-01-01 00:00:01','yyyy-mm-dd HH24:MI:SS') 效果很好,但就我而言,我找不到这样的格式。

请问我应该使用哪种日期格式?

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您不能将to_date() 与您的字符串原样使用,因为.0 部分代表毫秒 - 而Oracle 的日期数据类型没有毫秒精度:

    select to_date('1970-01-01 00:00:01.0','YYYY-MM-DD HH24:MI:SS') from dual;
    
    ORA-01830: date format picture ends before converting entire input string
    
    select to_date('1970-01-01 00:00:01.0','YYYY-MM-DD HH24:MI:SS.FF') from dual;
    
    ORA-01821: date format not recognized
    

    该错误是因为模型的 FF 部分不适用于日期。

    您可以转换为时间戳:

    select to_timestamp('1970-01-01 00:00:01.0','YYYY-MM-DD HH24:MI:SS.FF') from dual;
    
    TO_TIMESTAMP('1970-01-0
    -----------------------
    1970-01-01 00:00:01.000
    

    然后,如果您真的只想将其作为日期,请将其转换为日期:

    select cast(to_timestamp('1970-01-01 00:00:01.0','YYYY-MM-DD HH24:MI:SS.FF') as date) from dual;
    
    CAST(TO_TIMESTAMP('
    -------------------
    1970-01-01 00:00:01
    

    或者您可以在使用 to_date() 之前使用字符串操作来删除小数秒部分,或者 如果它始终是 .0 - 没有变化 - 您可以将其视为格式模型的常量部分[正如@mathguy 已经展示的那样]。

    还请注意,您拥有的值可以被视为时间戳文字,但前提是整个事物都是固定值:

    select timestamp '1970-01-01 00:00:01.0' from dual;
    
    TIMESTAMP'1970-01-0100:
    -----------------------
    1970-01-01 00:00:01.000
    

    如果需要,您可以再次将其转换为日期。

    【讨论】:

    • “没有变化”是不正确的。格式模型中的“.0”将毫无问题地处理输入中的 .9。我已经说过,如果输入可能有 .309,那么格式模型中的“.000000000”也会处理。
    • 嗯,是的,不知道为什么它允许这样做。好吧,我已经提到了你的答案。
    • 当我发现这一点时我感到很惊讶(通过实验——有人,也许是同一张海报,也许是其他人,几天前在 OTN 上问了同样的事情:community.oracle.com/thread/4270079)。我认为 Oracle 正是针对这个用例做到了这一点!
    【解决方案2】:

    您需要转换为日期还是时间戳?

    如果您需要转换为日期,并忽略小数秒,您可以使用日期格式模型中的样板格式元素。

    to_date('1970-01-01 00:00:01.0','yyyy-mm-dd HH24:MI:SS".0"')
    

    注意我添加的内容:引号中的字符串,即.0。这将屏蔽任何十进制数字,而不仅仅是 0(但它必须是数字)。

    如果某些输入可能有更多小数位,您可以扩展样板文本,例如“.000000000”如果格式模型中有“太多零”(与输入相比),那将起作用;但如果太少,就不会了。

    【讨论】:

      猜你喜欢
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      • 2015-04-12
      • 2020-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多