SQL Server获取连续区间的日期
目前实现方法有:
- 通过系统表master..spt_values获取
- 用WHILE循环获取
- 游标获取
- 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获取连续区间的日期的更多相关文章
- SQLServer数据库之SQL Server 获取本周,本月,本年等时间内记录
本文主要向大家介绍了SQLServer数据库之SQL Server 获取本周,本月,本年等时间内记录,通过具体的内容向大家展现,希望对大家学习SQLServer数据库有所帮助. datediff(we ...
- SQL Server获取下一个编码字符串的实现方案分割和进位
我在前一种解决方案SQL Server获取下一个编码字符实现和后一种解决方案SQL Server获取下一个编码字符实现继续重构与增强两篇博文中均提供了一种解决编码的方案,考虑良久对比以上两种方 ...
- SQL Server获取下一个编码字符实现继续重构与增强
我在SQL Server获取下一个编码字符实现的博文中,虽然实现了这个问题,但是感觉维护起来比较麻烦,例如如果调整编码字符串的固定长度,就需要变更三个函数,这样的为何成本确实比较大.面向对象编 ...
- SQL SERVER获取数据库文件信息
MS SQL SERVER 获取当前数据库文件等信息,适用于多个版本: SELECT dbf.file_id AS FileID , dbf.name AS [FileName] , s.fi ...
- SQL Server判断是否满足日期格式(YYYYMMDD)以及中文等判断,格式化为YYYY-MM-DD
SQL Server判断是否满足日期格式(YYYYMMDD)以及中文等判断: 在做sql数据的正确性审核中,需要判断数据是否满足日期格式,网上找不到相关的资料,于是自己花了半天写了一个简单的函数 具体 ...
- 【SQL Server】MS SQL Server中的CONVERT日期格式化大全
CONVERT 函数将某种数据类型的表达式显式转换为另一种数据类型.SQL Server中 将日期格式化. SQL Server 支持使用科威特算法的阿拉伯样式中的数据格式. 在表中,左侧的两列表示将 ...
- SQL Server获取指定行的数据
SQL Server获取指定行(如第二行)的数据 --SQL Server获取指定行(如第二行)的数据-- --法一(对象法)-- select * from ( select * , numbe ...
- 常用脚本--SQL Server获取OS日志
--=================================================== --SQL Server获取OS日志: ), ), ), ) select @start_d ...
- SQL Server系统函数:日期函数
原文:SQL Server系统函数:日期函数 1.返回当前日期和时间 select GETDATE() '当前日期-精确到33毫秒' select GETUTCDATE() 'UTC日期和时间-精确到 ...
随机推荐
- Docker的安装和测试
1,Docker安装 Docker是啥,以及其与虚拟机的对比,就不介绍了,网上有很多资源可以学习和了解. 本篇文章重点介绍Docker的安装和测试使用. Docker的安装,分为离线安装和在线安装两种 ...
- maven的pom文件中指定编译的版本
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> ...
- 了解mysqlpump工具
Ⅰ.功能分析 1.1 多线程介绍 mysqlpump是MySQL5.7的官方工具,用于取代mysqldump,其参数与mysqldump基本一样 mysqlpump是多线程备份,但只能到表级别,单表备 ...
- [OPEN CV] 常用视频操作方法
一.视频的定义 视频(Video)泛指将一系列静态影像以电信号的方式加以捕捉.纪录.处理.储存.传送与重现的各种技术.连续的图像变化每秒超过24帧(frame)画面以上时,根据视觉暂留原理,人眼无法辨 ...
- Django 的数据库查询
class Blog(models.Model): name = models.CharField(max_length=100) tagline = models.TextField() def _ ...
- python中RabbitMQ的使用(安装和简单教程)
1,简介 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现的产品,RabbitMQ是一个消息代理,从"生产者"接收消息 ...
- python之@property
在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: s = Student() s.score = 9999 这显然不合逻辑.为了限制score的 ...
- 再谈.net的堆和栈---.NET Memory Management Basics
.NET Memory Management Basics .NET memory management is designed so that the programmer is freed fro ...
- BZOJ_2764_[JLOI2011]基因补全_DP_高精度
BZOJ_2764_[JLOI2011]基因补全_DP_高精度 Description 在生物课中我们学过,碱基组成了DNA(脱氧核糖核酸),他们分别可以用大写字母A,C,T,G表示,其中A总与T配对 ...
- Python Django 2.2登录功能_2
#Now 让我们继续对上篇的登录进行操作 #对于csrf,以后再开篇章记录 #修改index.html <form method="post" action="/l ...