生成日历表的T-SQL函数

生成日历表的T-SQL函数,sql,sql-server-2008,Sql,Sql Server 2008,我需要创建一个用户定义的函数,其中包含两个返回表的传入参数。 第一个参数@开始日期类型。 第二个参数@结束日期类型 没有任何应用程序生成它。我只需要SQL server中的一个结果。我正在寻找一个简单的T-SQL解决方案。SQL 2012适合我 从数据库功能名称“2013年10月3日”、“2013年11月21日”中选择* 它必须像这样返回日历表 Su Mo Tu We Th Fr Sa 3 4 5 6 7 8 9 10 11

我需要创建一个用户定义的函数,其中包含两个返回表的传入参数。 第一个参数@开始日期类型。 第二个参数@结束日期类型

没有任何应用程序生成它。我只需要SQL server中的一个结果。我正在寻找一个简单的T-SQL解决方案。SQL 2012适合我

从数据库功能名称“2013年10月3日”、“2013年11月21日”中选择*

它必须像这样返回日历表

Su  Mo  Tu  We  Th  Fr  Sa
                3   4   5
6   7   8   9   10  11  12
13  14  15  16  17  18  19
20  21  22  23  24  25  26
27  28  29  30  31  1   2
3   4   5   6   7   8   9
10  11  12  13  14  15  16
17  18  19  20  21

没有简单的解决办法。在whiskyglass.Contents.Any将此作为一项挑战,这就是我得到的

CREATE FUNCTION dbo.GenerateCalendar
(
@Startdate DATE, @EndDate DATE
)
RETURNS 
@Cal TABLE 
( Yr INT, Wk INT,Sun DATE, Mon DATE, Tue DATE, Wed DATE, Thu DATE, Fri DATE, Sat DATE)
AS
BEGIN
    DECLARE @DaystoBuild int
    DECLARE  @IntCal TABLE(MonthDate date, Dow INT, YearNum INT , WeekNum int)
    SET @DaystoBuild = DATEDIFF(day, @StartDate, @EndDate)

;WITH NumbersTable AS (
   SELECT 0 AS number
   UNION ALL
   SELECT number + 1
   FROM NumbersTable
   WHERE
   number <@DaystoBuild
 ),
MonthNums (BaseDate,[Index], MonthDate)
AS
( 
SELECT @StartDate, number, DATEADD(d, number, @StartDate)
FROM NumbersTable
)
INSERT INTO @IntCal
SELECT MonthDate, DATEPART(weekday, MonthDate) , DATEPART(year, MonthDate), DATEPART(week, MonthDate)
FROM MonthNums 

INSERT INTO @Cal
SELECT  *   FROM @IntCal
PIVOT
( MAX(MonthDate)
FOR Dow IN ( [1],[2],[3],[4],[5],[6],[7])
)AS F ORDER BY 1,2,3


    RETURN
END
这不太正确-输出是一个日期而不是一个整数,并且在年份边界处表现不好,但它可能足以满足纯t-SQL解决方案的要求


在SQL FIDLE中添加一个副本

返回以这种特定方式格式化的数据时,最好在表示层中处理,而不是让数据库来处理。这是可行的……您将需要引用一些东西来保存带有“day”列的每个day表。然后,使用七个子选择语句构建每一天的week、day,并在week将它们连接在一起。与Rikalous的观点相呼应,表示层是一种更好的处理方法。谢谢你的回答。我调整了一下,得到了我需要的东西
CREATE FUNCTION dbo.GenerateCalendar
(
@StartDate DATE, @EndDate DATE
)
RETURNS @Cal TABLE (Yr INT, Wk INT,Sun DATE, Mon DATE, Tue DATE, Wed DATE, Thu DATE, Fri DATE, Sat DATE)
AS
BEGIN
    DECLARE @DaystoBuild int
    DECLARE  @IntCal TABLE(MonthDate date, Dow INT, YearNum INT , WeekNum int)
    SET @DaystoBuild = DATEDIFF(day, @StartDate, @EndDate)
;
WITH NumbersTable AS (
   SELECT 0 AS number
   UNION ALL
   SELECT number + 1
   FROM NumbersTable
   WHERE
   number <@DaystoBuild
 ),
MonthNums (BaseDate,[Index], MonthDate)
AS
( 
SELECT @StartDate, number, DATEADD(d, number, @StartDate)
FROM NumbersTable
)
INSERT INTO @IntCal
SELECT MonthDate, DATEPART(weekday, MonthDate) , DATEPART(year, MonthDate), DATEPART(week, MonthDate)
FROM MonthNums 

INSERT INTO @Cal
SELECT  *   FROM @IntCal
PIVOT
( MAX(MonthDate)
FOR Dow IN ( [1],[2],[3],[4],[5],[6],[7])
)AS F ORDER BY 1,2,3
    RETURN
END
GO

select * from GenerateCalendar ('2013-10-12',DATEADD (MONTH,1,'2013-10-12'))