Oracle 从dual connect by level

Oracle 从dual connect by level,oracle,datetime,Oracle,Datetime,有人能解释一下下面的oracle查询是做什么的,它的输出是什么吗 select unique trunc(sysdate-370 + level, 'IW') AS datetime from dual connect by level <= 360 order by datetime; 2017年9月13日运行时的输出为52行,我跳过了几行: 05-SEP-2016 12-SEP-2016 19-SEP-2016 26-SEP-2016 03-OCT-2016 ... 31-JUL-

有人能解释一下下面的oracle查询是做什么的,它的输出是什么吗

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

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
根据truncdateval,“IW”截断为:

一周中的同一天为ISO 8601标准定义的日历周的第一天,即星期一

逐级连接 将生成360行,从当前日期/时间减去370天,再加上每行一天开始。因此,当前日期/时间前369到10天之间的行

将截短日期至该周星期一的ISO周午夜开始-无论日期语言和/或地域的NLS设置是否影响截短日期的其他一些选项。因此,对于同一周内生成的每一行,您将得到重复的行

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

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


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

您是否确切知道truncsomedate“IW”的作用?我仍然不清楚这个IW选项。这并不总是生成52行。为什么您认为这是一个适合您的问题的好标题?您发布的查询似乎以一种非常笨拙、稍有错误和低效的方式生成,但并不重要,因为处理量很小,大约过去一年的每个星期一的日期滚动窗口:一年结束于今天,当前星期一和前一周的星期一除外。如果有评论或文档来确认这确实是代码的意图,那将是非常好的;然后可以用更好的方式重写。
select sysdate-370 + level AS datetime
from   dual 
connect by level <= 360;