何时以及为什么现实世界中使用的TRUNC(日期,[格式化])

问题描述:

我正在进入Oracle数据库。我遇到了TRUNC(DATE, [FMT])函数。我不是很清楚它,除了它似乎返回某种初始值?何时以及为什么现实世界中使用的TRUNC(日期,[格式化])

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

+1

*“它返回起始值或某种类型”*您是否阅读过[documentation](https://docs.oracle.com/database/122/SQLRF/TRUNC-date.htm#SQLRF06151) ?文档的哪一部分让你对函数的功能感到困惑?它甚至有一个很好的例子。 – Andreas

另一件事是有用的是让当天的时间成分。我使用表达式像这一切的时候:

SELECT sysdate - trunc(sysdate) AS TodaysTime FROM DUAL 

由于系统日期存储在一个十进制格式(例如sysdate = 42651.2426897456)和整数值对应于午夜时分,我可以使用上面的语句,仅保留小数点部分(例如TodaysTime = 0.2426897456,或者早上6点之前)。

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

+0

我必须查找十进制格式。大声笑!我永远不会知道这样的事情是可用的。学到了新东西。谢谢。 – javaTwilight

试试这个查询知道什么时候它可能是有用的:

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

谢谢,我现在可以看到它如何在我的工作中使用 – javaTwilight

+0

如果你不喜欢这个问题,那么请[upvote it](https://meta.stackexchange.com/questions/173399/how-to-upvote-on-堆栈溢出)谢谢。 – krokodilko

+0

会做。我认为第三列beginning_of_current_hour应该是hh。再次感谢 – javaTwilight

一个真实世界的例子就是如果你想每年按表格汇总结果。您可以使用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

+0

感谢您的例子。我只是没有看到以前如何使用它。 – javaTwilight

+0

没问题。随时提出答案。 ;-) – Momus