目前实现方法有:

  1. 通过系统表master..spt_values获取
  2. 用WHILE循环获取
  3. 游标获取
  4. CTE递归(感谢博友提供)

方法一:通过系统表master..spt_values获取

1、获取连续的日

-- 获取连续区间的日期
DECLARE @StartTime DATE = '2019-03-08', -- 开始时间
@EndTime DATE = '2019-03-18' -- 结束时间 SELECT CONVERT(NVARCHAR(10),DATEADD(DAY,number,@StartTime),120) AS DayTime
FROM master..spt_values
WHERE type = 'p'
AND number <= DATEDIFF(DAY,@StartTime,@EndTime)

2、获取连续的月

-- 获取连续区间的月份
DECLARE @StartTime DATE = '2019-03-08', -- 开始时间
@EndTime DATE = '2019-12-28' -- 结束时间 SELECT CONVERT(VARCHAR(7),DATEADD(MONTH,number,@StartTime),120) AS MonthTime
FROM master..spt_values WITH (NOLOCK)
WHERE type='P'
AND number <= DATEDIFF(MONTH,@StartTime,@EndTime)

3、获取连续的年

-- 获取连续区间的年份
DECLARE @StartTime DATE = '2019-03-08', -- 开始时间
@EndTime DATE = '2020-03-08' -- 结束时间 SELECT CONVERT(VARCHAR(4),DATEADD(YEAR,number,@StartTime),120) AS YearTime
FROM master..spt_values WITH (NOLOCK)
WHERE type='P'
AND number <= DATEDIFF(YEAR,@StartTime,@EndTime)

master..spt_values原理:

通过number来实现年月日的加减,因为number值最大是2047,所以只能连续加2047。

如图:结束时间是'2026-03-28',但我们降序可以看到,从2019-03-08只能增加连续2047天,如此2024-10-24之后的日期就没有了。

所以如果连续区间超过了2048,则此方法不适用,此时可以用以下方法二来实现

方法二:用WHILE循环获取

1、获取连续的日

-- 连续获取天
DECLARE @StartTime DATE = '2019-03-08', -- 开始时间
@EndTime DATE = '2019-03-18' -- 结束时间 -- 创建临时表#DateTime存储日期
CREATE TABLE #DateTime
(
DayTime DATE
); -- 循环获取日期插入临时表
WHILE @StartTime <= @EndTime
BEGIN
INSERT INTO #DateTime (DayTime)
VALUES (@StartTime);
SET @StartTime = DATEADD(DAY, 1, @StartTime);
END; SELECT DayTime FROM #DateTime; -- 删除临时表
DROP TABLE #DateTime;

2、获取连续的月

-- 连续获取的月
DECLARE @StartTime DATE = '2019-03-08', -- 开始时间
@EndTime DATE = '2019-12-28' -- 结束时间 -- 创建临时表#MonthTime存储日期
CREATE TABLE #MonthTime
(
MonthTime VARCHAR(7)
); -- 循环获取日期插入临时表
WHILE @StartTime <= @EndTime
BEGIN
INSERT INTO #MonthTime (MonthTime)
VALUES (CONVERT(VARCHAR(7),@StartTime));
SET @StartTime = DATEADD(MONTH, 1, @StartTime);
END; SELECT MonthTime FROM #MonthTime; -- 删除临时表
DROP TABLE #MonthTime;

3、获取连续的年

-- 连续获取的月
DECLARE @StartTime DATE = '2019-03-08', -- 开始时间
@EndTime DATE = '2025-03-28' -- 结束时间 -- 创建临时表#YearTime存储日期
CREATE TABLE #YearTime
(
YearTime VARCHAR(4)
); -- 循环获取日期插入临时表
WHILE @StartTime <= @EndTime
BEGIN
INSERT INTO #YearTime (YearTime)
VALUES (CONVERT(VARCHAR(4),@StartTime));
SET @StartTime = DATEADD(YEAR, 1, @StartTime);
END; SELECT YearTime FROM #YearTime; -- 删除临时表
DROP TABLE #YearTime;

方法三:用游标获取,原理和WHILE循环相似,此处不再展示

方法四:评论区博友说的CTE递归

DECLARE @StartTime DATE = '2018-12-08', -- 开始时间
@EndTime DATE = '2019-03-18' -- 结束时间
;
-- 获取连续天
WITH CteDateDay AS
(
SELECT @StartTime DayTime
UNION ALL
SELECT DATEADD(DAY,1,DayTime) DayTime FROM CteDateDay
WHERE DayTime<@EndTime
)
SELECT DayTime FROM CteDateDay
OPTION (MAXRECURSION 0)
; -- 获取连续月
WITH CteDateMonth AS
(
SELECT CONVERT(VARCHAR(7),@StartTime,120) MonthTime
UNION ALL
SELECT CONVERT(VARCHAR(7),DATEADD(MONTH,1,CAST(MonthTime+'-01' AS DATE)),120) DayTime FROM CteDateMonth
WHERE MonthTime<CONVERT(VARCHAR(7),@EndTime,120)
)
SELECT MonthTime FROM CteDateMonth
OPTION (MAXRECURSION 0)
; -- 获取连续年
WITH CteDateYear AS
(
SELECT DATEPART(YEAR,@StartTime) YearTime
UNION ALL
SELECT YearTime+1 DayTime FROM CteDateYear
WHERE YearTime<DATEPART(YEAR,@EndTime)
)
SELECT YearTime FROM CteDateYear
OPTION (MAXRECURSION 0)

如果有什么好的方法和建议,欢迎大家来指点,谢谢!

SQL Server获取连续区间的日期的更多相关文章

  1. SQLServer数据库之SQL Server 获取本周,本月,本年等时间内记录

    本文主要向大家介绍了SQLServer数据库之SQL Server 获取本周,本月,本年等时间内记录,通过具体的内容向大家展现,希望对大家学习SQLServer数据库有所帮助. datediff(we ...

  2. SQL Server获取下一个编码字符串的实现方案分割和进位

        我在前一种解决方案SQL Server获取下一个编码字符实现和后一种解决方案SQL Server获取下一个编码字符实现继续重构与增强两篇博文中均提供了一种解决编码的方案,考虑良久对比以上两种方 ...

  3. SQL Server获取下一个编码字符实现继续重构与增强

        我在SQL Server获取下一个编码字符实现的博文中,虽然实现了这个问题,但是感觉维护起来比较麻烦,例如如果调整编码字符串的固定长度,就需要变更三个函数,这样的为何成本确实比较大.面向对象编 ...

  4. SQL SERVER获取数据库文件信息

        MS SQL SERVER 获取当前数据库文件等信息,适用于多个版本: SELECT dbf.file_id AS FileID , dbf.name AS [FileName] , s.fi ...

  5. SQL Server判断是否满足日期格式(YYYYMMDD)以及中文等判断,格式化为YYYY-MM-DD

    SQL Server判断是否满足日期格式(YYYYMMDD)以及中文等判断: 在做sql数据的正确性审核中,需要判断数据是否满足日期格式,网上找不到相关的资料,于是自己花了半天写了一个简单的函数 具体 ...

  6. 【SQL Server】MS SQL Server中的CONVERT日期格式化大全

    CONVERT 函数将某种数据类型的表达式显式转换为另一种数据类型.SQL Server中 将日期格式化. SQL Server 支持使用科威特算法的阿拉伯样式中的数据格式. 在表中,左侧的两列表示将 ...

  7. SQL Server获取指定行的数据

    SQL Server获取指定行(如第二行)的数据   --SQL Server获取指定行(如第二行)的数据-- --法一(对象法)-- select * from ( select * , numbe ...

  8. 常用脚本--SQL Server获取OS日志

    --=================================================== --SQL Server获取OS日志: ), ), ), ) select @start_d ...

  9. SQL Server系统函数:日期函数

    原文:SQL Server系统函数:日期函数 1.返回当前日期和时间 select GETDATE() '当前日期-精确到33毫秒' select GETUTCDATE() 'UTC日期和时间-精确到 ...

随机推荐

  1. Vlan 原理

    VLAN(Virtual LAN),翻译成中文是"虚拟局域网".LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成的企业网络.VLAN所指的LAN特指使用路由 ...

  2. 言简意赅的TIME_WAIT

    为什么要有TIME_WAIT? 主动关闭端发送完ACK后等2MSL(最长分节生命期),防止对端没有收到ACK这种情况,重发. 官方点,再官方点...... (1) 可靠地实现TCP全双工连接的终止: ...

  3. Linux kernel的中断子系统之(二):IRQ Domain介绍

    返回目录:<ARM-Linux中断系统>. 总结:一.二概述了软硬件不同角度的IRQ Number和HW Interrupt ID,这就需要他们之间架个桥梁. 三介绍了架设这种桥梁的几种方 ...

  4. springMVC引入Validation详解

    本文简单介绍如何引入validation的步骤,如何通过自定义validation减少代码量,提高生产力.特别提及:非基本类型属性的valid,GET方法的处理,validation错误信息的统一re ...

  5. LeetCode Javascript实现 258. Add Digits 104. Maximum Depth of Binary Tree 226. Invert Binary Tree

    258. Add Digits Digit root 数根问题 /** * @param {number} num * @return {number} */ var addDigits = func ...

  6. 《javascript语言精粹》读书笔记 Item2 对象

    第三章 对象 JavaScript的简单数据类型包括数字.字符串.布尔值(true和false).null值和undefined值.其他 数字.字符串和布尔值"貌似"对象,因为它们 ...

  7. 获得指定数据库中指定块表中所有实体的id

    该函数也使用外部指定图纸中的数据库中的块 Int getIdsByDwgBlkName(AcDbDatabase *pDwg, CString strBlkName, AcDbObjectIdArra ...

  8. BZOJ_4892_[Tjoi2017]dna_哈希

    BZOJ_4892_[Tjoi2017]dna_哈希 Description 加里敦大学的生物研究所,发现了决定人喜不喜欢吃藕的基因序列S,有这个序列的碱基序列就会表现出喜欢吃藕的 性状,但是研究人员 ...

  9. BZOJ_4443_[Scoi2015]小凸玩矩阵_二分+二分图匹配

    BZOJ_4443_[Scoi2015]小凸玩矩阵_二分+二分图匹配 Description 小凸和小方是好朋友,小方给小凸一个N*M(N<=M)的矩阵A,要求小秃从其中选出N个数,其中任意两个 ...

  10. linux学习之路(2)

    1.输入输出重定向  输入重定向中用到的符号及其作用 命令 < 文件 将文件作为命令的标准输入 命令 << 分界符 从标准输入中读入,直到遇见分界符才停止 命令 < 文件 1 ...