MSSQL生成连续日期的实施方法(mssql生成连续的日期)

数据库几乎每天都要进行各种维护及管理工作,有时候我们又需要获取给定日期范围内的连续日期,MSSQL 中可以使用内置函数或者其它的技术,对于 MSSQL 数据库实现生成连续日期的功能。

### 一、使用内置函数DATEDIFF

使用DATEDIFF函数,即可简单地实现生成连续日期功能:

SELECT B.day
FROM
(SELECT DATEADD(DAY, A.number+1, @Date) AS day
FROM
(SELECT number FROM dbo.SplitList(@Days))A) B

上面语句中,@Days是需要生成的连续日期的总天数,@Date为开始时间,SplitList函数是将@Days转换为一个表的TreeDecode函数的包装,语句的最终结果即为自@Date加上@Days个天数之后的连续日期。

### 二、使用Recursive CTE

Recursive CTE(递归。联接查询)是一种类似迭代的查询方式,有时使用Recursive CTE也可以实现生成连续日期的功能:

WITH CTE AS 
(
SELECT @Date AS [date]
UNION ALL
SELECT DATEADD(DAY, A.number+1, [date]) AS [Date]
FROM
(SELECT number FROM dbo.SplitList(@Days))A
INNER JOIN CTE ON A.number
)
SELECT [date]
FROM CTE

Recursive CTE允许使用一个查询来返回自身的虚拟结果集,上面语句,首先定义一个CTE(递归联接查询),从@ Date开始生成连续日期,当遍历SplitList函数的结果,累加使用DATEADD函数来获取每一天的日期,并且用INNER JOIN CTE组织每次生成的结果,直到@Days条件不再成立。

### 三、数据准备

上面使用的SplitList函数可以将用户输入的`@Days`天数,转换为一个表输出,下面是SplitList函数的定义:

CREATE FUNCTION dbo.SplitList (
@String varchar(1000)
)
RETURNS Table
AS
RETURN
(
WITH Split(stpos,endpos)
AS(
SELECT 0 AS stpos, CHARINDEX(',',@String) AS endpos
UNION ALL
SELECT endpos+1, CHARINDEX(',',@String,endpos+1)
FROM Split
WHERE endpos > 0
)
SELECT number = ROW_NUMBER() OVER(ORDER BY stpos),
Item = SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos)
FROM Split

)

### 四、总结

使用MSSQL的内置函数或者Recursive CTE可以快速实现生成连续日期的功能,如果想高效的完成该任务,可以使用SplitList函数转换用户输入的总天数为一个表,再进行迭代、累加查询得到结果。


数据运维技术 » MSSQL生成连续日期的实施方法(mssql生成连续的日期)