如何在 Oracle 中将日期截断为秒

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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 嗯,那它一定是在更新的版本中修复了...我会尝试将其精确定位到特定版本。

以上是关于如何在 Oracle 中将日期截断为秒的主要内容,如果未能解决你的问题,请参考以下文章

H2 数据库。如何在sql中将日期转换为秒?

如何在 SQL Server 中将“XX 天 XX 小时 XX 分钟”转换为秒?

如何在 BigQuery 标准 SQL 中将时间戳转换为秒

如何在hive中将品种自定义时间戳转换为秒

SQL - 在截断日期上滚动平均值

如何在Oracle中将时间戳转化为日期格式