2011-05-16 106 views
3

我應該使用存儲過程在SQL數據庫中填充日曆10年!創建日曆日期的結果集

我應該填寫三欄:日期,工作日或週末,日期(星期一,...)。

有人可以幫我嗎?

+0

確定您需要記錄?也許與..不存在..會給你你想要的結果。 – Teson 2011-05-16 18:48:37

回答

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) 
+0

我幾乎可以確定你的意思是'CONVERT(DATE,getdate())'。 – 2011-05-16 22:25:53

+0

@Andriy M是的,對於SQL Server 2008來說這更好 – RedFilter 2011-05-17 15:22:32

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) 
+0

我喜歡這些解決方案,但我需要使用startdate作爲參數! – Rachid 2011-05-17 08:27:53

+0

@Rachid,很簡單,只需要用你的參數替換所有'GETDATE()':'@StartDate datetime' – RacerX 2011-05-17 19:38:24

+0

謝謝賽車手,它真的很有幫助!!!!! – Rachid 2011-05-18 07:26:46

0

我apporached這是一個符合表問題。我使用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 
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 

輸出

1/1/2011星期一7 Week_day 1/2/2011星期一1 Week_day