首页 > 解决方案 > 从基于范围的查询中获取整个月份

问题描述

帮助

我有这些数据,其中有租赁的开始日期和结束日期。我需要像下表那样在几个月内拿到它。

我尝试使用while循环并将每个月作为参数调用,然后进行计算,但我得到了许多单独的表,并且联合都不起作用或者我没有正确管理它。

您对此任务有很好的解决方案吗?

标签: sqlsql-server

解决方案


如果您没有日历表,则可以使用临时 Tally/Numbers 表

例子

Select name
      ,startRental
      ,endRental
      ,durationDays = sum(1)
      ,month = month(D)
      ,year  = year(D)
 From  (
        Select * 
         From YourTable A
         Join (
                Select Top 10000 D=DateAdd(DAY,-1+Row_Number() Over (Order By (Select NULL)),'2000-01-01') 
                 From  master..spt_values n1, master..spt_values n2
              ) B on D between startRental and endRental
       ) A
 Group by Name
         ,startRental
         ,endRental
         ,month(d)
         ,year(d)

退货

name    startRental endRental   durationDays    month   year
a       2019-06-30  2019-07-07  1               6       2019
a       2019-06-30  2019-07-07  7               7       2019
b       2019-03-02  2019-04-03  30              3       2019
b       2019-03-02  2019-04-03  3               4       2019
c       2019-01-01  2019-01-30  30              1       2019
d       2019-01-01  2019-05-01  31              1       2019
d       2019-01-01  2019-05-01  28              2       2019
d       2019-01-01  2019-05-01  31              3       2019
d       2019-01-01  2019-05-01  30              4       2019
d       2019-01-01  2019-05-01  1               5       2019

注意:我选择了任意日期 2000-01-01 和 10,000 天(最大日期为 2027-05-19)。

另外,我不确定我是否同意您 2019 年 6 月的 2 天期限。它应该是 1。


推荐阅读