经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MS SQL Server » 查看文章
SQL Server获取连续区间的日期
来源:cnblogs  作者:农村的码农  时间:2019/3/11 8:58:26  对本文有异议

个人理解的方法有三种

  1. 通过系统表master..spt_values获取
  2. 用WHILE循环获取
  3. 游标获取

 

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

1、获取连续的日

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

 

 

 
2、获取连续的月

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

 

3、获取连续的年

  1. -- 获取连续区间的年份
  2. DECLARE @StartTime DATE = '2019-03-08', -- 开始时间
  3. @EndTime DATE = '2020-03-08' -- 结束时间
  4.  
  5. SELECT CONVERT(VARCHAR(4),DATEADD(YEAR,number,@StartTime),120) AS YearTime
  6. FROM master..spt_values WITH (NOLOCK)
  7. WHERE type='P'
  8. 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、获取连续的日

  1. -- 连续获取天
  2. DECLARE @StartTime DATE = '2019-03-08', -- 开始时间
  3. @EndTime DATE = '2019-03-18' -- 结束时间
  4.  
  5. -- 创建临时表#DateTime存储日期
  6. CREATE TABLE #DateTime
  7. (
  8. DayTime DATE
  9. );
  10. -- 循环获取日期插入临时表
  11. WHILE @StartTime <= @EndTime
  12. BEGIN
  13. INSERT INTO #DateTime (DayTime)
  14. VALUES (@StartTime);
  15. SET @StartTime = DATEADD(DAY, 1, @StartTime);
  16. END;
  17. SELECT DayTime FROM #DateTime;
  18. -- 删除临时表
  19. DROP TABLE #DateTime;

 

 

2、获取连续的月

  1. -- 连续获取的月
  2. DECLARE @StartTime DATE = '2019-03-08', -- 开始时间
  3. @EndTime DATE = '2019-12-28' -- 结束时间
  4.  
  5. -- 创建临时表#MonthTime存储日期
  6. CREATE TABLE #MonthTime
  7. (
  8. MonthTime VARCHAR(7)
  9. );
  10. -- 循环获取日期插入临时表
  11. WHILE @StartTime <= @EndTime
  12. BEGIN
  13. INSERT INTO #MonthTime (MonthTime)
  14. VALUES (CONVERT(VARCHAR(7),@StartTime));
  15. SET @StartTime = DATEADD(MONTH, 1, @StartTime);
  16. END;
  17. SELECT MonthTime FROM #MonthTime;
  18. -- 删除临时表
  19. DROP TABLE #MonthTime;

 

3、获取连续的年

  1. -- 连续获取的月
  2. DECLARE @StartTime DATE = '2019-03-08', -- 开始时间
  3. @EndTime DATE = '2025-03-28' -- 结束时间
  4.  
  5. -- 创建临时表#YearTime存储日期
  6. CREATE TABLE #YearTime
  7. (
  8. YearTime VARCHAR(4)
  9. );
  10. -- 循环获取日期插入临时表
  11. WHILE @StartTime <= @EndTime
  12. BEGIN
  13. INSERT INTO #YearTime (YearTime)
  14. VALUES (CONVERT(VARCHAR(4),@StartTime));
  15. SET @StartTime = DATEADD(YEAR, 1, @StartTime);
  16. END;
  17. SELECT YearTime FROM #YearTime;
  18. -- 删除临时表
  19. DROP TABLE #YearTime;

 

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

 

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

 

原文链接:http://www.cnblogs.com/kylan/p/10496817.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号