2017-09-13 95 views
-1

有人能解釋我下面的oracle查詢做了什麼,它的輸出是什麼?select unique trunc(sysdate-370 + level,'IW')AS datetime from dual connect by level <= 360 order by datetime

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

爲什麼你認爲這是你的問題的好標題? –

+0

您發佈的查詢似乎以非常笨拙且稍微不正確且效率低下的方式生成(儘管無關緊要,因爲處理量很小),每個星期一大約過去一年的日期(滾動窗口:一年* *今天結束**),除了當前和前一週的星期一。如果有評論或文件證實這確實是代碼的意圖,那將是非常好的;那麼它可以用更好的方式重寫。 – mathguy

回答

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 

根據documentationtrunc(dateval, 'IW')截斷爲:

的當天星期作爲ISO 8601標準定義的日曆周的第一天,星期一是

connect by level <= N是用於與從1 level值產生一組N行至N.

+0

你真的知道trunc(somedate'IW')是做什麼的嗎?我仍然不清楚這個IW選項。 –

+0

請參閱https://stackoverflow.com/questions/32603365/what-exactly-does-truncdate-iw –

+0

這並不總是生成52行。 – MT0

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

將生成開始與當前日期/時間減去370天加上每行1天360行的特技。因此,在當前日期/時間之前369到10天之間的行。

TRUNC(datetime, 'IW')會將日期截斷到ISO開始的那一週(該周的星期一的午夜 - 不考慮日期語言的NLS設置和/或影響截斷日期的某些其他選項的區域)。所以你最終會得到同一周內每個生成行的重複行。

UNIQUE關鍵字將擺脫那些重複的行。

order by datetime將按日期升序排列結果 - 但是,行是按升序生成的,所以此子句是不必要的。

因此,輸出將從每週的週一午夜開始,包含當前日期前369天的日期,直到包含日期前10天的一週爲止的52或53行(取決於當週的當前日期)當前日期。