2014-02-23 43 views
0

目前我有以下ORACLE代碼輸出給定MonthYear的星期的StartDate和EndDate作爲輸入。如何在PostgreSQL中輸入MonYYYY時使用generate_series輸出星期startDate和endDate

WITH t 
    AS (SELECT To_date('Jan2014', 'MonYYYY')       orig_date, 
       Next_day(To_date('Jan2014', 'MonYYYY') - 7, 'MONDAY') start_day 
     FROM dual) 
SELECT start_day + (7 * (LEVEL - 1)), 
     start_day + (7 * (LEVEL - 1)) + 6 
FROM t, 
     dual 
CONNECT BY start_day + (7 * (LEVEL - 1)) < 
      Add_months(Trunc(orig_date, 'MM'), 1); 

所需O/P應當輸入是Jan2014是

30 Dec 2013 to 05 Jan 2014, 
06 Jan 2014 to 12 Jan 2014, 
13 Jan 2014 to 19 Jan 2014, 
20 Jan 2014 to 26 Jan 2014, 
27 Jan 2014 to 02 Feb 2014 

如何使用PostgreSQL的generate_series或類似PostgreSQL代碼輸出所需的startDate和結束日期以上述格式??

+0

我很困惑。以上代碼在Postgres中不起作用,因爲它是Oracle代碼。它應該在Postgres中返回一個錯誤(我得到的是'by'在錯誤的地方)。那麼,Oracle *沒有返回正確結果的問題呢?問題是你不能在Postgres中寫這段代碼?或者,在問題中確實有與查詢無關的特定結果?沒有人試圖回答這個問題,所以你在修復它時有很大的靈活性。 –

+0

是的,你說得對。道歉我無法在postGreSQL中編寫代碼,上面的代碼是Oracle代碼。請建議 –

回答

1
SELECT to_char(d, 'DD Mon YYYY" to "') 
    || to_char(d+6, 'DD Mon YYYY') AS week 
FROM (
    SELECT generate_series(d1 
         ,d1 + interval '4 weeks' 
         ,interval '1 week')::date AS d 
    FROM (SELECT date_trunc('week', to_date('Jan2014', 'MonYYYY')) AS d1) sub1 
) sub2 

根據要求輸出。

-> SQLfiddle

+0

謝謝Erwin的時間和回答 –

1

下面的查詢生成輸出相同甲骨文:

select cast('2013-12-30' as date) + n*7 as startdate, 
     cast('2013-12-30' as date) + n*7+6 as enddate 
from generate_series(0, 4) n; 

編輯:

這裏是另一種方法:

select prevMon + interval '1' day * n*7 as startdate, 
     prevMon + interval '1' day * (n*7+6) as enddate 
from (select cast(const.yyyymm||'-01' as date) - interval '1' day * (extract(isodow from cast(const.yyyymm||'-01' as date))) as prevMon 
     from (select cast('2013-01' as varchar(255)) as yyyymm) const 
    ) t cross join 
    generate_series(0, 4) n; 

注意它的變化對年份和月份的表達, YYYYMM。

+0

謝謝,我的問題是我的輸入是2014年1月,在上面的情況下,它的YYYY-MM-DD我怎麼能只通過MMYYY並獲得所需的o/p? –

相關問題