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日期和时间-精确到 ...
随机推荐
- adSage :2013年教育行业搜索引擎投放分析报告
- HTTP多线程下载+断点续传(libcurl库)
目录索引: 一.LibCurl基本编程框架 二.一些基本的函数 三.curl_easy_setopt函数部分选项介绍 四.curl_easy_perform 函数说明(error 状态码) 五.lib ...
- 第五章——支持向量机(Support Vector Machines)
svm可用于线性或非线性分类.回归.甚至异常检测. svm尤其适用于中小数据集的复杂分类问题. 5.1 Linear SVM Classification svm对feature scales敏感,如 ...
- jquery选择器 看这个链接吧!2017.6.2
http://www.cnblogs.com/tylerdonet/archive/2013/04/02/2996713.html关于jquery选择器说明.
- javascript 数组以及对象的深拷贝(复制数组或复制对象)的方法
前言 for,slice(0),concact() 在js中,数组和对象的复制如果使用=号来进行复制,那只是浅拷贝.如下图演示: 如上,arr的修改,会影响arr2的值,这显然在绝大多数情况下,并不 ...
- 7.app和app后端的通讯
经常有开发者问:app和后端通讯是用http协议还是私有的协议?是用长连接还是短连接?通过阅读本文,帮你解除上面的疑问. (1)是用http协议还是私有的协议? 在间谍电视剧中,经常能看到间谍们的书信 ...
- persistent_storage_worker.go
package) ) :length],) ) :length]) } func (engine *Engine) persistentStorageInitWorker(shard int) { ...
- golang接口三个特性
类型和接口 因为映射建设在类型的基础之上,首先我们对类型进行全新的介绍.go是一个静态性语言,每个变量都有静态的类型,因此每个变量在编译阶段中有明确的变量类型,比如像:int.float32.MyTy ...
- Bootstrap 小结
Bootstrap 小结 Bootstrap4特点:1.兼容IE10+ 2.使用flexbox 布局 3.抛弃Nomalize.css 4.提供布局和 reboot 版本 Bootstrap组成:1. ...
- jdk源码剖析四:JDK1.7升级1.8 HashMap原理的变化
一.hashMap数据结构 如上图所示,JDK7之前hashmap又叫散列链表:基于一个数组以及多个链表的实现,hash值冲突的时候,就将对应节点以链表的形式存储. JDK8中,当同一个hash值(T ...