您现在的位置:首页 >> 数据库 >> SQLServer >> 内容

SQL Server获取连续区间的日期

时间:2019-5-8 9:16:09

  核心提示:个人理解的方法有三种通过系统表master..spt_values获取用WHILE循环获取游标获取CET递归(感谢评论区博友)方法一:通过系统表master..spt_values获取1、获取连续的日...

个人理解的方法有三种

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

 

方法一:通过系统表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循环相似,此处不再展示

 

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

 

DECLARE @StartTime DATE = '2018-12-08', -- 开始时间
@EndTime DATE = '2019-03-18' -- 结束时间
;
-- 获取连续天
WITH CetDateDay AS
(
SELECT @StartTime DayTime
UNION ALL
SELECT DATEADD(DAY,1,DayTime) DayTime FROM CetDateDay
WHERE DayTime<@EndTime
)
SELECT DayTime FROM CetDateDay
OPTION (MAXRECURSION 0)
;
-- 获取连续月 WITH CetDateMonth 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 CetDateMonth WHERE MonthTime<CONVERT(VARCHAR(7),@EndTime,120) ) SELECT MonthTime FROM CetDateMonth OPTION (MAXRECURSION 0) ;
-- 获取连续年 WITH CetDateYear AS ( SELECT DATEPART(YEAR,@StartTime) YearTime UNION ALL SELECT YearTime+1 DayTime FROM CetDateYear WHERE YearTime<DATEPART(YEAR,@EndTime) ) SELECT YearTime FROM CetDateYear OPTION (MAXRECURSION 0)

 

Java免费学习 ,   Java自学网 http://www.javalearns.com

关注微信号:javalearns   随时随地学Java

或扫一扫

随时随地学Java

作者:不详 来源:网络
    你是从哪里知道本网站的?
  • 网友介绍的
  • 百度搜索的
  • Google搜索的
  • 其它搜索过来的
  • 网址输错了进来的
  • 太忙了不记得了
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
  • java学习网(www.javalearns.com) © 2014 版权所有 All Rights Reserved.
  • Email:javalearns@163.com 站长QQ:1356121699 晋ICP备14003680号-3
  • java学习网部分内容来自网络或网友发布,如侵犯了您利益,请发邮件至:javalearns@126.com,我们尽快处理!
  • Java学习网
  • 网站统计
  • 晋公网安备 14042902000001号