Получение точных значений дня в месяц, между 2 датами - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь получить количество дней в месяце между двумя датами.Так что в идеале это выглядело бы как

Month | Days
 Jan  |  5
 Feb  |  28
March |  5

Даты должны исходить из таблицы, которая выглядит следующим образом:

Name | Age | Address   | AddressStartDate| AddressEndDate 
Steve| 19  | randomAdd | 2018-01-26      | 2018-03-05
Steve| 21  | randomAdd | 2018-01-26      | 2018-03-05

Проблема, с которой я сталкиваюсь, заключается в том, что у меня может быть несколькоСтивы в этой таблице с одинаковыми датами начала и окончания.

В идеале я не хотел бы создавать таблицу календаря, и я нашел способ обойти это, используя -

Declare @dtFrom date 
Declare @dtTo date


select @dtFrom = 2018-01-26
      ,@dtTo   = 2018-03-05

select 
    year(dt) [Year], month(dt) [Month],  
    count(*)
from 
(
    select top(datediff(d, @dtFrom, @dtTo)) dateadd(d,  row_number() over 
(order by (select null)), @dtFrom) dt
    from sys.columns) q
    group by year(dt), month(dt
)
order by [Year], [Month]

, но я не могу понять, как я могу разделить их,Могу ли я получить их в 1 таблице?

У меня сейчас около 1500 строк, для которых мне нужно будет воспроизвести эти данные!

1 Ответ

0 голосов
/ 20 февраля 2019

Вы были на правильном пути, вам просто нужно использовать CROSS APPLY

Пример

Declare @YourTable Table ([Name] varchar(50),[Age] int,[Address] varchar(50),[AddressStartDate] date,[AddressEndDate] date)  
Insert Into @YourTable Values 
 ('Steve',19,'randomAdd','2018-01-26','2018-03-05')
,('Steve',21,'randomAdd','2018-01-26','2018-03-05')

Select A.* 
      ,B.*
 From @YourTable A
 Cross Apply (
                Select Month=DateName(MONTH,D)
                     ,Days = count(*)
                 From (
                        Select Top (DateDiff(DAY,[AddressStartDate],[AddressEndDate])+1) D=DateAdd(DAY,-1+Row_Number() Over (Order By (Select Null)),[AddressStartDate]) 
                         From  master..spt_values n1,master..spt_values n2
                      ) B1
                 Group By Year(D),DateName(MONTH,D)
             ) B

Возвращает

enter image description here

РЕДАКТИРОВАТЬ - Обновлено для NULL EndDate

Select A.* 
      ,B.*
 From @YourTable A
 Cross Apply (
                Select Month=DateName(MONTH,D)
                     ,Days = count(*)
                 From (
                        Select Top (DateDiff(DAY,[AddressStartDate],IsNull([AddressEndDate],GetDate()))+1) D=DateAdd(DAY,-1+Row_Number() Over (Order By (Select Null)),[AddressStartDate]) 
                         From  master..spt_values n1,master..spt_values n2
                      ) B1
                 Group By Year(D),DateName(MONTH,D)
             ) B

Окончательное редактирование - Конкат год к месяцу

Select A.* 
      ,B.*
 From @YourTable A
 Cross Apply (
                Select Month=concat(DateName(MONTH,D),'-',year(D))
                     ,Days = count(*)
                 From (
                        Select Top (DateDiff(DAY,[AddressStartDate],IsNull([AddressEndDate],GetDate()))+1) D=DateAdd(DAY,-1+Row_Number() Over (Order By (Select Null)),[AddressStartDate]) 
                         From  master..spt_values n1,master..spt_values n2
                      ) B1
                 Group By Year(D),DateName(MONTH,D)
             ) B
...