我应该使用存储过程在SQL数据库中填充日历10年!
我应该填写三列记录:日期,工作日或周末,日期(星期一,......)。
有人能帮助我吗?
答案 0 :(得分:2)
你可以像这样动态地做到:
WITH Dates AS (
SELECT CONVERT(DATE, getdate()) as [Date]
UNION ALL
SELECT DATEADD(DAY, 1, [Date])
FROM Dates
where Date < dateadd(yy, 10, getdate())
)
SELECT [Date]
FROM Dates
OPTION (MAXRECURSION 4000)
答案 1 :(得分:0)
尝试此版本(将日期时间置于底部并添加所有请求的列):
;WITH Dates AS (
SELECT DATEADD(day,DATEDIFF(day,0,GETDATE()),0) as DateOf,
CASE WHEN datename(weekday,getdate()) IN ('Saturday','Sunday') THEN 'Weekend'
ELSE 'WeekDay'
END DayType,
datename(weekday,getdate()) DayOfWeekName
UNION ALL
SELECT DateOf+1,
CASE WHEN datename(weekday,DateOf+1) IN ('Saturday','Sunday') THEN 'Weekend'
ELSE 'WeekDay'
END DayType,
datename(weekday,DateOf+1) DayOfWeekName
FROM Dates
where DateOf < dateadd(yy, 10, getdate())
)
SELECT DateOf,DayType,DayOfWeekName
FROM Dates
OPTION (MAXRECURSION 4000)
插入表中试试这个:
DECLARE @DateTable table (DateOf datetime, DayType char(7), DayOfWeekName varchar(10))
;WITH Dates AS (
SELECT DATEADD(day,DATEDIFF(day,0,GETDATE()),0) as DateOf,
CASE WHEN datename(weekday,getdate()) IN ('Saturday','Sunday') THEN 'Weekend'
ELSE 'WeekDay'
END DayType,
datename(weekday,getdate()) DayOfWeekName
UNION ALL
SELECT DateOf+1,
CASE WHEN datename(weekday,DateOf+1) IN ('Saturday','Sunday') THEN 'Weekend'
ELSE 'WeekDay'
END DayType,
datename(weekday,DateOf+1) DayOfWeekName
FROM Dates
where DateOf < dateadd(yy, 10, getdate())
)
INSERT INTO @DateTable (DateOf,DayType,DayOfWeekName)
SELECT DateOf,DayType,DayOfWeekName
FROM Dates
OPTION (MAXRECURSION 4000)
从@DateTable中选择前10 *
OTUPUT:
DateOf DayType DayOfWeekName
----------------------- ------- -------------
2011-05-16 00:00:00.000 WeekDay Monday
2011-05-17 00:00:00.000 WeekDay Tuesday
2011-05-18 00:00:00.000 WeekDay Wednesday
2011-05-19 00:00:00.000 WeekDay Thursday
2011-05-20 00:00:00.000 WeekDay Friday
2011-05-21 00:00:00.000 Weekend Saturday
2011-05-22 00:00:00.000 Weekend Sunday
2011-05-23 00:00:00.000 WeekDay Monday
2011-05-24 00:00:00.000 WeekDay Tuesday
2011-05-25 00:00:00.000 WeekDay Wednesday
(10 row(s) affected)
答案 2 :(得分:0)
我认为这是一个计数表问题。我使用Master的spt_values作为我的计数表。它只能达到2048年,这足以维持5。5年的数据。您可以根据需要创建自己的计数表。
Declare @startDate Date = '1/1/2011';
SELECT DateAdd(d, number, @startDate) [Date],
CASE WHEN DATEPART(dw, DateAdd(d, number, @startDate)) IN (1,7) THEN 'Weekend' ELSE 'Weekday' END [WeekDayEnd],
DateName(weekday, DateAdd(d, number, @startDate)) DayOfWeek
FROM spt_values
WHERE type = 'P';
这会得到以下结果:
Date WeekDayEnd DayOfWeek
2011-01-01 Weekend Saturday
2011-01-02 Weekend Sunday
2011-01-03 Weekday Monday
2011-01-04 Weekday Tuesday
2011-01-05 Weekday Wednesday
2011-01-06 Weekday Thursday
2011-01-07 Weekday Friday
2011-01-08 Weekend Saturday
2011-01-09 Weekend Sunday
2011-01-10 Weekday Monday
答案 3 :(得分:0)
使用此
set nocount on
SET DATEFIRST 7;
go
select date,
datename(dw,datepart(dw,date)) Day,
datepart(dw,date) Day,
'Segment' = case
when datepart(dw,date)in (5,6) then 'WEEK_END' else 'Week_day' end
from calenderdate
set nocount off
> set nocount on > > select date, > substring(cast(datename(dw,datepart(dw,date))as > varchar(10)),1,3) Day, 'Segment' = > case when datepart(dw,date)in (5,6) > then 'WEEK_END' else 'Week_day' end > from calenderdate > > set nocount off
输出
2011年1月1日星期一7星期一 1/2/2011星期二1周_天