选择唯一的截断(sysdate-370 +级别,' IW')AS日期时间来自双级连接级别< = 360 order by datetime

时间:2017-09-13 13:16:26

标签: oracle datetime

有人可以解释一下下面的oracle查询做了什么以及它的输出是什么?

select unique trunc(sysdate-370 + level, 'IW') AS datetime from dual 
connect by level <= 360 order by datetime;

2 个答案:

答案 0 :(得分:2)

select sysdate-370 + level AS datetime
from   dual 
connect by level <= 360;

将从当前日期/时间减去370天以及每行一天生成360行。所以在当前日期/时间之前369到10天之间的行。

TRUNC( datetime, 'IW' )会将日期截断为ISO周的开始日期(该周一的午夜 - 无论日期语言和/或领域的NLS设置如何影响截断日期的其他选项)。因此,对于同一周内生成的每一行,最终会得到重复的行。

UNIQUE关键字将删除那些重复的行。

order by datetime将按升序日期顺序排列结果 - 但是,行是按升序生成的,因此不需要此子句。

所以输出将是52或53行(取决于当周的当天)从每周的周一午夜开始,包含当前日期前369天的日期,直到当前包含10天的那一周日期。

答案 1 :(得分:0)

输出(2017年9月13日运行时)为52行(我跳过了几行):

05-SEP-2016
12-SEP-2016
19-SEP-2016
26-SEP-2016
03-OCT-2016
...
31-JUL-2017
07-AUG-2017
14-AUG-2017
21-AUG-2017
28-AUG-2017

根据documentation trunc(dateval, 'IW')截断到:

  

与ISO 8601标准(即星期一)定义的日历周的第一天相同的一周

connect by level <= N是一个用于生成一组N行的技巧,其中level值从1到N.