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

时间:2017-08-14 18:11:29

标签: sql oracle truncate

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

有人能教育我吗?何时或将用于工作,或者为什么有人可能想要使用该功能?

3 个答案:

答案 0 :(得分:1)

尝试此查询以了解何时可能有用:

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' )

答案 1 :(得分:1)

如果您想逐年汇总表格中的结果,那么现实世界就是一个例子。你可以像这样使用TRUNC函数:

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

...将返回一组结果,第一列的日期被截断到年初,第二列是所有具有该年份日期的记录的计数。

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

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

如果你要比较日期,你可能只想使用一定程度的精确度。如果您有一个时间戳列,并且您想要今天的所有记录,则可以根据时间戳大于昨天午夜且低于今天午夜的范围进行选择,或者您可以选择截断到DATE的时间戳位置等于今天。

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

答案 2 :(得分:0)

另一件有用的事情是获取当天的时间成分。我一直使用这样的表达式:

SELECT sysdate - trunc(sysdate) AS TodaysTime FROM DUAL

因为系统日期以十进制格式存储(例如sysdate = 42651.2426897456)并且整数值对应于午夜,所以我可以使用上述语句仅获取小数部分(例如TodaysTime = 0.2426897456,或者就在早上6点之前。)

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