Создание строк с датами от полуночи до полуночи для нескольких строк во временном интервале - PullRequest
0 голосов
/ 04 июля 2019

У меня есть следующая проблема, и мне интересно, как лучше решить ее в SQL. У меня есть таблица, как следует:

enter image description here

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

2019-06-24 19:15:05 -> 2019-06-24 23:59:00
2019-06-25 00:00:00 -> 2019-06-26 18:47:39
2019-06-26 19:02:40 -> 2019-06-26 23:59:00 
2019-06-27 00:00:00 -> 2019-06-27 23:59:00 
2019-06-28 00:00:00 -> 2019-06-28 23:59:00 
2019-06-29 00:00:00 -> 2019-06-29 23:59:00 
2019-06-30 00:00:00 -> 2019-06-30 23:59:00
2019-07-01 00:00:00 -> 2019-07-01 23:59:00 
2019-07-02 00:00:00 -> 2019-07-02 01:58:32
2019-07-02 02:01:10 -> 2019-07-02 23:59:00 
2019-07-03 00:00:00 -> 2019-07-03 23:59:00
2019-07-04 00:00:00 -> 2019-07-04 23:59:00
2019-07-05 00:00:00 -> 2019-07-05 01:35:00

Таким образом, по сути, мои пролеты должны переходить от FromTimes к ToTimes с новой строкой для каждой полуночи между каждым днем ​​

Кто-нибудь может дать мне знать лучший подход к этому? Я пробовал курсор, повторяющийся каждый день в пределах промежутков, но я не думаю, что это лучший подход. Кто-нибудь может дать какое-нибудь руководство?

1 Ответ

1 голос
/ 04 июля 2019

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

with cte as (
      select fromtime,
             (case when datediff(day, fromtime, totime) = 0
                   then totime
                   else dateadd(day, 1, convert(date, fromtime))
              end) as dayendtime,
             totime
      from t
      union all
      select dayendtime as fromtime,
             (case when datediff(day, dayendtime, totime) = 0
                   then totime
                   else dateadd(day, 1, dayendtime)
              end) as dayendtime,
             totime
       from cte
       where dayendtime < totime
      )
select fromtime, dateadd(minute, -1, dayendtime)
from cte;

Здесь - это дБ <> скрипка.

Если у вас может быть больше 100 дней, вам нужно добавить option (maxrecursion 0) к запросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...