【问题标题】:How to trunc a date to seconds in Oracle如何在 Oracle 中将日期截断为秒
【发布时间】:2008-10-01 15:23:35
【问题描述】:

This page 提到如何将时间戳截断为分钟/小时/等。在甲骨文中。

如何以同样的方式将时间戳缩短为秒?

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    由于DATE 的精度是秒(并且没有秒的小数部分),所以根本不需要TRUNC

    数据类型TIMESTAMP 允许几分之一秒。如果您将其转换为 DATE,则会删除小数秒 - 例如

    select cast(systimestamp as date) 
      from dual;
    

    【讨论】:

    • 我不明白为什么这有这么多赞成票并被选为答案。它不起作用,至少在 12c 中不起作用。最初的帖子是在 2008 年 - 也许它当时有效。今天在 12c 中,它返回包含秒数的完整日期。 select cast(systimestamp as date) from dual; 返回12/27/2019 7:54:35 AM
    • 是的,应该如此。但不是秒的分数,例如12/27/2019 7:54:35.534648.
    • 啊,我明白了。我将问题误解为 OP 如何截断日期的秒数。这样它将返回12/27/2019 7:54
    • 我愿意,但需要编辑答案才能这样做。
    • @alexherm 还不错。但我不会编辑它,因为 11 年来只有一个人不明白“小数秒将被删除”并不意味着“整秒将被删除”:-)
    【解决方案2】:

    对不起,我的前辈们似乎都错了。

    select cast(systimestamp as date) from dual 
    

    ..不截断,而是舍入到下一秒。

    我使用一个函数:

    CREATE OR REPLACE FUNCTION TRUNC_TS(TS IN TIMESTAMP) RETURN DATE AS
    BEGIN
    
        RETURN TS;
    
    END;
    

    例如:

    SELECT systimestamp
        ,trunc_ts(systimestamp) date_trunc
        ,CAST(systimestamp AS DATE) date_cast 
    FROM dual;
    

    返回:

    
        SYSTIMESTAMP                       DATE_TRUNC             DATE_CAST
        21.01.10 15:03:34,567350 +01:00    21.01.2010 15:03:34    21.01.2010 15:03:35
    

    【讨论】:

    • 我运行了您的代码,但无法重现您的发现。在几十个测试中(其中大部分会受到四舍五入的影响),三个结果之间的秒数部分从来没有不同。您使用的是哪个版本的 Oracle? (我在 11.2)。
    • CAST 将在版本 11i 之前四舍五入并在之后截断。请参阅 Oracle HTML 文档中的 [隐式数据转换](docs.oracle.com/cd/E11882_01/server.112/e26088/…)。
    【解决方案3】:

    关于截断 Oracle 日期的一般主题,这里是可用于日期 trunc() 和 round() 函数的格式模型的文档链接

    http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/functions242.htm#sthref2718

    “秒”未列出,因为 DATE 数据类型的粒度为秒。

    【讨论】:

      【解决方案4】:

      我用过这样的函数:

      FUNCTION trunc_sec(p_ts IN timestamp)
      IS
          p_res timestamp;
      BEGIN
          RETURN TO_TIMESTAMP(TO_CHAR(p_ts, 'YYYYMMDDHH24MI'), 'YYYYMMDDHH24MI');
      END trunc_sec;
      

      【讨论】:

      • 我认为这是要走的路,因为与大多数答案不同,它独立于 Oracle 的版本。但是,这并不完全正确-您错过了几秒钟。应该是这样的: to_date(to_char(systimestamp,'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD HH24:MI:SS')
      【解决方案5】:

      仅将工作截断到最小值,转换为日期to_char(START_TIME,'YYYYMMDDHH24MISS')

      或者干脆select to_char(current_timestamp, 'YYYYMMDDHH24MISS') from dual;

      https://www.techonthenet.com/oracle/functions/trunc_date.php

      【讨论】:

        【解决方案6】:

        要将timestamp 截断为秒,您可以将其转换为日期:

        CAST(timestamp AS DATE)
        

        然后执行文章中的TRUNC

        TRUNC(CAST(timestamp AS DATE), 'YEAR')
        

        【讨论】:

          【解决方案7】:

          某事的顺序:

          select to_char(current_timestamp, 'SS') from dual;
          

          【讨论】:

          • 虽然这是最明显的解决方案,但SS 不是 to_char 的有效格式,并且以ORA-01899: bad precision specifier 失败。它也没有被列为可行的选项:docs.oracle.com/cd/B19306_01/server.102/b14200/…
          • 有趣。它在我的实例中运行良好。我正在运行 12c (12.2.0.1.0) 64 位。您的链接转到 Trunc/Round。该示例使用 to_char。试试techonthenet.com/oracle/functions/to_char.php
          • 嗯,那它一定是在更新的版本中修复了...我会尝试将其精确定位到特定版本。
          猜你喜欢
          • 2012-02-19
          • 2021-06-11
          • 2021-04-06
          • 1970-01-01
          • 1970-01-01
          • 2019-11-04
          • 2015-12-12
          • 1970-01-01
          相关资源
          最近更新 更多