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 ALLSELECT 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 TableAS
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函数转换用户输入的总天数为一个表,再进行迭代、累加查询得到结果。