如何在 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 中将日期截断为秒的主要内容,如果未能解决你的问题,请参考以下文章