Преобразование списка дат в одном столбце в несколько диапазонов дат на SQL сервере - PullRequest
0 голосов
/ 09 января 2020

У меня было бизнес-требование, в котором мне нужно преобразовать даты списка в диапазон дат. Логическое c будет заключаться в создании диапазона дат до непрерывной даты, если дата не является непрерывной, то будет создан новый диапазон

Ниже приведен пример таблицы

  ID      Module  Employeeid   Date
    --------------------------------------------
    11      M1         9        2019-10-01 00:00:00.000 
    12      M1         9        2019-10-02 00:00:00.000 
    13      M1         9        2019-10-03 00:00:00.000 
    14      M2         9        2019-10-04 00:00:00.000 
    15      M2         9        2019-10-05 00:00:00.000
    16      M2         9        2019-10-08 00:00:00.000
    17      M2         9        2019-10-09 00:00:00.000

Требуемый вывод

  Module  Employeeid   Start Date    End Date
    ---------------------------------------------------
    M1         9        2019-10-01  2019-10-03 
    M1         9        2019-10-04  2019-10-05
    M1         9        2019-10-08  2019-10-09

Ниже приведен запрос, который я пробовал, и он работает, но нам нужно добавить фильтр даты и даты, чтобы после добавлен фильтр OutPut неправильно

WITH mycte 
     AS (SELECT *, 
                Dateadd(day, -Row_number() 
                                OVER ( 
                                  partition BY [[module] 
                                  ORDER BY [Date]), [Date]) AS grp 
         FROM   [to_shiftschedule] 
         WHERE  employeeid = 535                 
               ) 
SELECT Min([Date]) AS[StartDate], 
       Max([Date]) AS[EndDate], 
       [employeeid], 
       [module] 
FROM   mycte 
where   CONVERT(VARCHAR, Date, 103) >= CONVERT(VARCHAR, '09/01/2020', 103) 
        AND CONVERT(VARCHAR, Date, 103) <= CONVERT(VARCHAR, '23/01/2020', 103)
GROUP  BY[employeeid], [module], grp 
ORDER  BY[startdate] DESC; 

1 Ответ

1 голос
/ 09 января 2020

Если проблема связана с фильтром даты, то есть в этом разделе, я полагаю

where   CONVERT(VARCHAR, Date, 103) >= CONVERT(VARCHAR, '09/01/2020', 103) 
    AND CONVERT(VARCHAR, Date, 103) <= CONVERT(VARCHAR, '23/01/2020', 103)

, причина может быть в сравнении varchars вместо простых дат.

Я предлагаю вам использовать следующее условие:

where Date >= '2020-01-09' and Date <= '2020-01-23'

Кстати, я также советую вам отредактировать ваше окончательное предложение SQL, потому что неясно, какой столбец вы назвали "Дата".

Пожалуйста, дайте мне знать, помогло это или нет.

...