2013-04-05 280 views
0

我需要生成無論是在查詢中的列或臨時表(不知道哪一個是必需的)日期範圍

,這樣我可以有一個列表中我能在本週結束日期(週六)星期六在特定日期範圍內的日期。

此列表將用於加入以將記錄與周關聯。

我有什麼選擇?

樣品輸入:

來源:2013年3月1日

爲:2013年4月30日

結果:

周結束 - 2013年3月2日 - 03/09/2013 - 2013年3月16日 - 2013/03/23 - 2013/03/30 - 04/06/2013 - 04/13/2013 - 2013年4月20日 - 2013年4月27日 - 2013年5月4日

當前代碼:

create table #TBL7(YEAR INT, WEEKNUMBER INT, STARTDATE DATETIME, ENDDATE DATETIME) 


begin 
    declare @startdate datetime 
        , @enddate datetime 
        , @ctr int 

    SET @startdate = CAST(2013 AS VARCHAR)+ '/01/01' 
    SET @enddate = CAST(2013 AS VARCHAR) + '/12/31' 
    SET @ctr = 0 
    WHILE @enddate >= @startdate 
    BEGIN 
      SET @ctr = @ctr + 1 
      INSERT INTO #TBL7 
      values(year(@startdate), @ctr, @startdate, @startdate + 6) 
      SET @startdate = @startdate + 7 
    END 

end 



select * from #TBL7 
+1

可以顯示樣本數據和所需結果嗎?字問題在這裏不是很有效。 – 2013-04-05 14:36:28

+0

這有幫助嗎? http://stackoverflow.com/questions/15543977/ms-sql-server-2008-getting-start-date-and-end-date-of-the-week-to-next-8-weeks/15546165#15546165 – 2013-04-05 14:43:25

+0

你的編程問題是什麼?你需要拿出你的解決方案,如果你堅持一些編程這個網站可以幫助你。 – Mowgli 2013-04-05 15:05:03

回答

0

這是甲骨文代碼。對不起,我不知道如何將其轉換爲SQL SERVER。不應該很難。您所需要的只是使用適當的函數代替to_date()和to_char(),並計算開始日期和結束日期之間的差異。 (END_DATE-起始日期)+1:

WITH data(r, some_date) AS 
(
SELECT 1 r, to_date('03/01/2013', 'MM/DD/YYYY') some_date FROM dual 
    UNION ALL 
SELECT r+1, to_date('03/01/2013', 'MM/DD/YYYY')+r FROM data WHERE r < 61 -- (end_date-start_date)+1 
) 
SELECT some_date 
     , To_Char(some_date, 'DY') wk_day 
    FROM data 
    WHERE To_Char(some_date, 'DY') = 'SAT' 
/

SOME_DATE WK_DAY 
-------------------- 
3/2/2013  SAT 
3/9/2013  SAT 
3/16/2013 SAT 
3/23/2013 SAT 
3/30/2013 SAT 
4/6/2013  SAT 
4/13/2013 SAT 
4/20/2013 SAT 
4/27/2013 SAT 
0

這應該工作:

WITH cteWeeks (WeekEnding) As 
(
    -- Find the Saturday of the first week. 
    -- Need to allow for different DATEFIRST settings: 
    SELECT 
     CASE 
     WHEN DatePart(dw, DateAdd(day, @@datefirst, @StartDate)) = 7 THEN @StartDate 
     ELSE DateAdd(day, 7 - DatePart(dw, DateAdd(day, @@datefirst, @StartDate)), @StartDate) 
     END 

    UNION ALL 

    SELECT 
     DateAdd(day, 7, WeekEnding) 
    FROM 
     cteWeeks 
    WHERE 
     WeekEnding < @EndDate 
) 
SELECT 
    WeekEnding 
FROM 
    cteWeeks 
; 

http://www.sqlfiddle.com/#!3/d41d8/12095

0

首先,創建一個calendar table。那麼你有一個非常簡單的查詢:

select [Date] 
from dbo.Calendar 
where DayOfWeek = 'Saturday' and [Date] between '20130301' and '20130430' 

日曆表幾乎總是使用日期,因爲你與數據,而不是代碼工作的最好方式,所以你可以看到它是正確的,有沒有神祕代碼保持。