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日期和时间-精确到 ...
随机推荐
- 并发库应用之五 & ReadWriteLock场景应用
Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也应该是一个对象.两个线程执行的代码片段要实现同步互斥的效果,它们必须用同一个Lock对象. 读写锁:分为读 ...
- jenkins+gitlab自动化编译部署方案探索及服务端编译webpack实战
一. 背景 之前我们的开发流程为在本地进行webpack打包编译,然后svn提交源代码和编译后的代码.同时每次提交前也会从svn更新源代码和编译后的代码.这样做有几个缺点: 1. svn 更新和提交编 ...
- Matlab与C混编的介绍
原本写给一个朋友的,帮助她入门matlab与C混编的 >#####环境: * Matlab:MATLAB R2013a * C编译器VC++2012 === #####配置环境: 在**Matl ...
- MySQL使用一张表的字段更新另一张表的字段
转自https://blog.csdn.net/anxpp/article/details/73173274 update table1 t1 left join table2 t2 on t1.ke ...
- 【BZOJ 3626】 [LNOI2014]LCA【在线+主席树+树剖】
题目链接: TP 题解: 可能是我比较纱布,看不懂题解,只好自己想了…… 先附一个离线版本题解[Ivan] 我们考虑对于询问区间是可以差分的,然而这并没有什么卵用,然后考虑怎么统计答案. 首先LC ...
- Error【0003】:配置桥接网络报错
1.1 问题背景 在配置cosole宿主机的桥接网络环境时,在修改完/etc/sysconfig/ifcg-ethx和/etc/sysconfig/ifcg-brx后,执行service networ ...
- html中layui+jfinal模板实现前端搜索功能
<input type="text" id="campus" class="layui-input" onkeyup="ck ...
- 终于将SAP系统完全配置通过了
花了近10天的时间,每天晚上加班加点,终于将SAP S4 1610 IDES系统从零到有,从头到尾配置一遍.目前只启用了一家模拟公司,从基础数据的设置,到销售订单开立(含按单按库需求),跑MRP需求, ...
- 一起来学Spring Cloud | 第二章:服务注册和发现组件 (Eureka)
本篇文章,很浅显的一步步讲解如何搭建一个能运行的springcloud项目(带所有操作截图).相信!看完本篇之后,你会觉得springcloud搭建如此简单~~~~ 一. Eureka简介: 1.1 ...
- MySQL 中基于 XA 实现的分布式事务
1 XA协议 首先我们来简要看下分布式事务处理的XA规范可知XA规范中分布式事务有AP,RM,TM组成: 其中应用程序(Application Program ,简称AP):AP定义事务边界(定义事务 ...