sqlServer利用递归查询------将日期范围转换为日期表

-- 创建日期表
CREATE TABLE #DateTable
(
    TheDate DATE NOT NULL PRIMARY KEY
);
 
-- 插入日期序列
DECLARE @StartDate DATE = '2021-01-01', @EndDate DATE = '2021-12-31';
 
WITH DateSequence(Date) AS
(
    SELECT CAST(@StartDate AS DATE) AS Date
    UNION ALL
    SELECT DATEADD(DAY, 1, Date)
    FROM DateSequence
    WHERE DATEADD(DAY, 1, Date) <= @EndDate
)
INSERT INTO d#DateTable(TheDate)
SELECT Date
FROM DateSequence
OPTION (MAXRECURSION 0); -- 移除递归限制

select *
from DateTable

---------------

ALTER FUNCTION [dbo].[fn_GenerateDates]
(
    @StartDate DATETIME, 
    @EndDate DATETIME
)
 
RETURNS @Output TABLE 
(
      Value NVARCHAR(4000)
)
 
AS
 
BEGIN
 
    INSERT INTO @Output
    
    SELECT TOP (DATEDIFF(Day, @StartDate, @EndDate)+1) 
        CONVERT(VARCHAR(10), YEAR(DATEADD(Day, number, @StartDate))) + '-' + DATENAME(MONTH, DATEADD(Day, number, @StartDate)) + '-' + DATENAME(Day, DATEADD(Day, number, @StartDate)) AS Months
        FROM [master].dbo.spt_values 
        WHERE [type] = N'P' 
        ORDER BY number
 
    RETURN
END
 

 
select Value from [dbo].fn_GenerateDates('2001-02-01','2001-02-15')
 
select Value from [dbo].fn_GenerateDates('1951-01-01','2024-12-31')

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值