生成日历表的T-SQL函数
我需要创建一个用户定义的函数,其中包含两个返回表的传入参数。 第一个参数@开始日期类型。 第二个参数@结束日期类型 没有任何应用程序生成它。我只需要SQL server中的一个结果。我正在寻找一个简单的T-SQL解决方案。SQL 2012适合我 从数据库功能名称“2013年10月3日”、“2013年11月21日”中选择* 它必须像这样返回日历表生成日历表的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
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'))