Как вычесть смещение датам, сгенерированным через рекурсивный CTE? - PullRequest
1 голос
/ 19 февраля 2020

В приведенном ниже запросе используется рекурсивный CTE для генерации дней, если нет данных для этого указанного c дня. Я хочу сгруппировать общее количество ежедневных простоев, начиная с 7:15 предыдущего дня до 7:15 следующего дня, и делаю это в течение месяца. Этот запрос работает нормально, но мне нужно вычитать DATEADD (минуты, - (7 * 60 + 15) из каждого дня.

WITH dates as (
      SELECT CONVERT(date, 'Anydate') as dte
      UNION ALL
      SELECT DATEADD(day, 1, dte)
      FROM dates
      WHERE dte < 'Anydate + 1 month later'
     )
SELECT CONVERT(datetime,d.dte), ISNULL(SUM(long_stop_minutes), 0) AS downtime
FROM dates d LEFT JOIN
     long_stops_table b
     ON CAST(t_stamp as DATE) = d.dte AND Type = 'downtime'
GROUP BY CONVERT(datetime, d.dte)
ORDER BY CONVERT(datetime, d.dte) ASC;

1 Ответ

1 голос
/ 19 февраля 2020

Просто вычтите соответствующие единицы времени. Вот один из способов:

SELECT d.dte, 
       COALESCE(SUM(lst.long_stop_minutes), 0) AS downtime
FROM dates d LEFT JOIN
     long_stops_table lst
     ON CONVERT(date, DATEADD(minute, -(7 * 60 + 15), lst.t_stamp) = d.dte AND
        lst.Type = 'downtime'
GROUP BY d.dte
ORDER BY d.dte ASC;

Я не вижу причин для преобразования dates.dte в datetime, поэтому я просто удалил преобразование.

...