何时以及为何在现实世界中使用 TRUNC(DATE, [FORMAT])

When and why does the TRUNC(DATE, [FORMAT]) used in the real world

我正在进入 Oracle 数据库。我遇到了 TRUNC(DATE, [FMT]) 函数。我不是很清楚,除了它似乎 return 某种起始值?

有人可以教我吗?它在工作中什么时候使用或用于什么,或者为什么有人可能想要使用该功能?

试试这个查询,看看它什么时候有用:

ALTER SESSION SET NLS_DATE_FORMAT = 'yyyy-mm-dd hh24:mi:ss';

select  sysdate,
        trunc( sysdate, 'mi' ) As beginning_of_current_minute,
        trunc( sysdate, 'mi' ) As beginning_of_current_hour,
        trunc( sysdate, 'dd' ) As beginning_of_current_day,
        trunc( sysdate, 'iw' ) As beginning_of_current_week,
        trunc( sysdate, 'mm' ) As beginning_of_current_month,
        trunc( sysdate, 'q' ) As beginning_of_current_Quarter,
        trunc( sysdate, 'y' ) As beginning_of_current_Year
FROM dual;

举个例子——你想获取从本周初开始的所有订单:

SELECT *
FROM ORDERS
WHERE order_date >= trunc( sysdate, 'iw' )

一个真实世界的例子是,如果您想按年份汇总 table 的结果。您可以像这样使用 TRUNC 函数:

SELECT TRUNC(my_date, 'YEAR') the_year, count(*)
FROM some_table
GROUP BY TRUNC(my_date, 'YEAR');

...这将 return 一组结果,其中第一列的日期被截断到年初,第二列是所有日期在该年内的记录的计数。

the_year, count(*)
_________________
01-JAN-12, 543
01-JAN-13, 1268
01-JAN-14, 1134
01-JAN-15, 1765

显然还有其他方法可以实现相同的目的,但这是您如何使用 TRUNC 的真实示例。

另一个可能是如果您正在比较日期并且只想使用一定程度的精度。如果您有时间戳列并且想要今天的所有记录,您可以 select 基于时间戳大于昨天午夜且小于今天午夜的范围,或者您可以 select 其中截断为 DATE 的时间戳等于今天。

https://docs.oracle.com/cd/E29805_01/server.230/es_eql/src/cdfp_analytics_lang_trunc.html

另一个有用的地方是获取当天的时间部分。我一直使用这样的表达方式:

SELECT sysdate - trunc(sysdate) AS TodaysTime FROM DUAL

因为系统日期是以小数形式存储的(例如sysdate = 42651.2426897456),而整数值对应的是午夜,所以我可以使用上面的语句只获取小数部分(例如TodaysTime = 0.2426897456 ,或者就在早上 6 点之前)。

可能有更简单的方法来做到这一点,但在我的应用程序中,这是最简单的方法,因为我经常只需要处理当天的时间部分。