T-SQL n строк для количества дней между 2 днями - PullRequest
1 голос
/ 28 октября 2019

У меня есть вопрос, на который я не могу ответить сам. Я использую T-SQL и основной запрос:

SELECT OpenArt, DayFrom, Dayto 
FROM Locations 
WHERE OpenArt = 'closed' AND S_ID = '123'

Я хочу получать каждую дату, когда мое местоположение закрыто. Это работает до сих пор, так как вывод выглядит примерно так:

| OpenArt | DayFrom    | DayTo      |
+---------+------------+------------+
| Closed  | 06.12.2019 | 09.12.2019 |
| Closed  | 23.12.2019 | 31.12.2019 |

По сути, он показывает диапазон, когда локация закрыта. Однако для API мне нужно отправлять 1 строку за каждый закрытый день. Таким образом, для диапазона 23.12.2019 - 31.12.2019 мне понадобится 9 отдельных строк, например:

| OpenArt | DayClosed  |
+---------+------------+
| Closed  | 23.12.2019 | 
| Closed  | 24.12.2019 | 
| Closed  | 25.12.2019 | 

и так далее. Имена заголовков не так важны, я могу это изменить. Я просто не знаю, как «обмануть» результаты, в зависимости от диапазона между 2 днями. Я знаю, что есть datediff(), но это все, что я мог придумать. Заранее спасибо.

Нет никаких ограничений, может быть новый temp_table, UDF или все, что работает.

1 Ответ

1 голос
/ 28 октября 2019

Один из вариантов - использовать специальную таблицу учета вместе с CROSS APPLY,

Пример

Set Dateformat DMY
Declare @YourTable Table ([OpenArt] varchar(50),[DayFrom] date,[DayTo] date)  Insert Into @YourTable Values 
 ('Closed','06.12.2019','09.12.2019')
,('Closed','23.12.2019','31.12.2019')

Select OpenArt
      ,DayClosed = D
 From @YourTable
 Cross Apply (
             Select Top (DateDiff(DAY,[DayFrom],[DayTo])+1) 
                    D=DateAdd(DAY,-1+Row_Number() Over (Order By (Select Null)),[DayFrom]) 
              From  master..spt_values n1,master..spt_values n2
             ) B

Возвраты

enter image description here

Или еще один вариант с известным диапазоном дат

Declare @Date1 date = '2019-01-01'
Declare @Date2 date = '2020-12-31'

Select OpenArt
      ,DayClosed = D
 From @YourTable
 Join ( 
        Select Top (DateDiff(DAY,@Date1,@Date2)+1) 
               D=DateAdd(DAY,-1+Row_Number() Over (Order By (Select Null)),@Date1) 
         From  master..spt_values n1,master..spt_values n2
      ) B on D between [DayFrom] and [DayTo]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...