2017-05-30 189 views
0

我正在嘗試查找一個月內所有星期的開始日期和結束日期。 目前,假設我有這個如何在oracle中查找一個月內所有星期的開始日期和結束日期

MAR-17 
APR-17 
MAY-17 
JUN-17 

我想

Month Week_start_date Week_start_date 

MAR-17 06-MAR-17   12-MAR-17 
MAR-17 13-MAR-17   19-MAR-17 
MAR-17 20-MAR-17   26-MAR-17 
MAR-17 27-MAR-17   02-APR-17 

APR-17 03-APR-17   09-APR-17 
APR-17 10-APR-17   16-APR-17 
APR-17 17-APR-17   23-APR-17 
APR-17 24-APR-17   30-APR-17 

MAY-17 and so on 
JUN-17 

我已經試過

select to_char(to_date('06-AUG-17'), 'iw')from dual ; 

但它給出了一種基於某一特定日期的WEEK_START_DATE開始,但我想對於WEEK_START_DATE開始每個月。 如果找到week_start_date,那麼我只需要添加+7即可獲取week_end_date。 誰能幫我

由於提前

回答

1

試試這個。在m表中添加更多月份,或將其替換爲您的實際表格。 我假設MAR-17是在varchar數據類型。如果不是,請將代碼to_date(mon,'MON-YY')替換爲代碼中的mon

SELECT mon, 
     TRUNC(to_date(mon,'MON-YY'), 'iw') + nxt AS iso_week_start_date , 
     TRUNC(to_date(mon,'MON-YY'), 'iw') + 6 + nxt AS iso_week_end_date 
FROM 
    (SELECT LEVEL*7 - 7 AS nxt 
    FROM dual CONNECT BY LEVEL <=6) 
CROSS JOIN 
    (SELECT 'MAR-17' AS mon 
    FROM dual 
    UNION ALL SELECT 'APR-17' 
    FROM dual 
    UNION ALL SELECT 'MAY-17' 
    FROM dual 
    ) m --Sample data. Replace with original table and change column mon to your `char` column. 
WHERE --where clause to filter out of month dates. 
    to_date(mon,'MON-YY') <= TRUNC(to_date(mon,'MON-YY'), 'iw') + nxt --iso_week_start_date 
    AND last_day(to_date(mon,'MON-YY')) >= TRUNC(to_date(mon,'MON-YY'), 'iw') + nxt --iso_week_start_date 
ORDER BY 2 

說明:

  • select TRUNC (sysdate, 'IW') from dual 返回一週(週一)的第一天給定日期的。

  • (選擇電平* 7 - 7從雙NXT通過<級別= 6連接)將在0,7,14,21,28,35。後來橫的範圍 geneate柱加入它乘以每個6個月生成6個不同的星期。

  • 利用這一點,同時將days添加到第一週。

  • Where子句用於過濾​​日期。

+0

謝謝@Utsav!謝謝你的解釋! – joe

+0

Hi @Utsav!只是一個初學者的疑問。這將是真正有用的,你可以分享你用來完成邏輯的思維過程。更具體地說,我想知道你是如何到達'超出界限'的條件 – joe

+0

f你知道如何計算本週開始時,您可以爲結束日添加6天。在交叉連接的幫助下,增加7。所以用'level'交叉連接可以給你這個範圍和6個輸出用於1個輸入。現在,如果您在任何一天添加31,您將跨越當前月份。此外'TRUNC(to_date(mon,'MON-YY'),'iw')'會爲您提供上個月的日期。因此,我們需要注意超出界限。 – Utsav

0

您可以使用類似:

SELECT DISTINCT day_of_month Week_start_date, day_of_month + 6 week_end_Date 
FROM 
(SELECT TRUNC (TO_DATE ('01/01/2017', 'dd/mm/yyyy'), 'Day') + 1 day_of_month 
    FROM DUAL 
    UNION ALL 
    SELECT TRUNC (TO_DATE ('01/01/2017', 'dd/mm/yyyy') + LEVEL,'Day')+ 1 day_of_month 
    FROM DUAL 
CONNECT BY LEVEL <= 365) 
ORDER BY day_of_month; 

說明

假設:

  • 一年的天數爲365
  • 的第一天蒙特h是週一

    1 SELECT DISTINCT day_of_month Week_start_date, day_of_month + 6 
        week_end_Date 
        2 FROM 
        3 (SELECT TRUNC (TO_DATE ('01/01/2017', 'dd/mm/yyyy'), 'Day') + 1 day_of_month 
         FROM DUAL 
        4 UNION ALL 
        5 SELECT TRUNC (TO_DATE ('01/01/2017', 'dd/mm/yyyy') + LEVEL,'Day')+ 1 day_of_month 
        FROM DUAL 
    6 CONNECT BY LEVEL <= 365) 
    7 ORDER BY day_of_month; 
    

    線5-6

    • 生成所有的日期從2017年1月1日至2017年12月31日在使用CONNECT BY子句級一 一年。

    • 對於生成的日期,在'Day'fmt過濾器中使用TRUNC函數找出每週的第一天。

    • 由於TRUNC函數將星期日作爲一週的開始,因此將其加1以得到與星期一相對應的日期。通過這個,我們得到了週一日期比01st其他Jan 2017

線3

  • 所有在今年天獲得相當於01日星期一2017年1月

    線1

    • 獲取截然不同的星期一日期並給它一個Week_Start_date的別名。添加6天它得到Week_end_Date
+0

嗨Vishad,你能解釋一下邏輯嗎? – joe

+0

嗨喬,添加解釋到查詢。希望能幫助到你。 – vishad

+0

嗨Vishad!感謝您的解釋 !您能否澄清一下「獲取與2017年1月1日相對應的星期一日期」? – joe

相關問題