有人可以解释一下下面的oracle查询做了什么以及它的输出是什么?
select unique trunc(sysdate-370 + level, 'IW') AS datetime from dual
connect by level <= 360 order by datetime;
答案 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.