【发布时间】:2014-01-31 13:45:57
【问题描述】:
这是我用来创建日历的语法。我遇到的问题是,由于 Week1 的开始日期是 2012 年,因此 startdate 显示为空。有没有办法让开始日期(或其他情况下的结束日期)填充,即使它在不同的年份? @变革之风 - - 这增加了之前为空的开始日期和结束日期。但是我所追求的是,例如,我需要我的日期范围来运行 Sat - Wed。因此,让我们以 2013 年的第 53 周为例。日期范围应为 2013 年 12 月 28 日 -- 2014 年 1 月 1 日。有没有办法让日历以这种格式显示?
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
【问题讨论】:
标签: sql sql-server calendar