2014-01-31 30 views
0

這是我用來創建日曆的語法。我的問題是,自第1周的開始日期是2012年以來,startdate顯示爲空。是否有辦法讓startdate(或其他實例中的enddate)填充,即使它在不同的年份? @Winds Of Change --- 這增加了之前爲空的開始日期和結束日期。但是我所追求的是,​​例如,我需要我的日期範圍來運行星期六至星期三。那麼讓我們在2013年的第53周。日期範圍應該是12/28/2013 - 01/01/14。有沒有一種方法可以修補calander以這種格式顯示?當日期在上一年開始時顯示爲空的日曆

CREATE TABLE dbo.Calendar (
    CalendarYear INT NOT NULL, 
    CalendarWeek INT NOT NULL, 
    WeekStartDate VARCHAR(50), 
    WeekEndDate VARCHAR(50), 
    CONSTRAINT PK_Calendar PRIMARY KEY (
     CalendarYear, 
     CalendarWeek 
     ) 
    ) 

SET DATEFIRST 6 

DECLARE @StartDate DATETIME, 
    @NumOfDays INT 

SET @StartDate = '20130101' 
SET @NumOfDays = 1000; 

WITH calendar 
AS (
    SELECT TOP (@NumOfDays) dateadd(day, row_number() OVER (
       ORDER BY sc1.column_id 
       ) - 1, @StartDate) AS CalendarDate 
    FROM sys.columns sc1 
    CROSS JOIN sys.columns sc2 
    ) 
INSERT INTO dbo.Calendar (
    CalendarYear, 
    CalendarWeek, 
    WeekStartDate, 
    WeekEndDate 
    ) 
SELECT DATEPART(year, c.CalendarDate) AS Year, 
    convert(VARCHAR(100), DATEPART(week, c.CalendarDate)) AS Week, --DATEPART(week, c.CalendarDate) AS Week,  
    MAX(CASE DATEPART(WEEKDAY, c.CalendarDate) 
      WHEN 1 
       THEN convert(VARCHAR(50), c.CalendarDate, 101) 
      ELSE NULL 
      END) AS StartDate, 
    MAX(CASE DATEPART(WEEKDAY, c.CalendarDate) 
      WHEN 7 
       THEN convert(VARCHAR(50), c.CalendarDate, 101) 
      ELSE NULL 
      END) AS EndDate 
FROM calendar c 
GROUP BY DATEPART(year, c.CalendarDate), 
    DATEPART(Week, c.CalendarDate) 
ORDER BY Year, 
    startdate, 
    convert(VARCHAR(100), DATEPART(week, c.CalendarDate)) --Week 

SELECT * 
FROM dbo.Calendar 

回答

1

所以你的問題是,是,你按周和年份分組,但在今年年初/結束,今年開始/在不同星期結束。因此,如果第一週在週三開始,那麼這一年只有3天。

我已經有了一個小修補程序,我已經開始工作,通過改變周圍的事物來顯示一年的第一天/最後一天作爲一週的開始/結束日期。這裏是我的修改版本:

SELECT 
    DATEPART(year, c.CalendarDate) AS Year, 
    convert(VARCHAR(100), DATEPART(week, c.CalendarDate)) AS Week, --DATEPART(week, c.CalendarDate) AS Week,  
    convert(VARCHAR(50), MIN(c.CalendarDate), 101) AS StartDate, 
    convert(VARCHAR(50), MAX(c.CalendarDate), 101) AS EndDate 
FROM 
    calendar c 
GROUP BY 
    DATEPART(year, c.CalendarDate), 
    DATEPART(Week, c.CalendarDate) 
ORDER BY 
    Year, 
    startdate, 
    convert(VARCHAR(100), DATEPART(week, c.CalendarDate)) --Week 

希望這會有所幫助。

編輯:迴應您的評論/編輯,看看這些更新聲明。把它們放在你的插入之後。

EDIT2:不要使用上面的插入以及更新。

update dbo.Calendar set WeekStartDate = convert(VARCHAR(50), dateadd(day, 1, dateadd(week, -1, cast(WeekEndDate as datetime))), 101) 
where WeekStartdate is null 

update dbo.Calendar set WeekEndDate = convert(VARCHAR(50), dateadd(day, -1, dateadd(week, 1, WeekStartDate)), 101) 
where WeekEndDate is null 
+0

這增加了之前爲空的開始日期和結束日期。但是我所追求的是,​​例如,我需要我的日期範圍來運行星期六至星期三。那麼讓我們在2013年的第53周。日期範圍應該是12/28/2013 - 01/01/14。有沒有一種方法可以修補calander以這種格式顯示? (原始文章修改爲相同的添加) – MasterOfStupidQuestions

+0

請查看我的最新更改,看看他們是否有所幫助。 –

+0

這是我得到 2013年12月28日\t 12/31/2013 2014年1月1日\t 2014年1月3日 我能有這樣的組合輸出,要麼顯示第53周12/28/2013 - 01/03/2014或第1周結算12/28/2013 - 01/03/2014? – MasterOfStupidQuestions

相關問題