Марк Гильо был на правильном пути, но я обнаружил некоторые проблемы с его запросом.Вот ревизия:
--this is setup, you don't need this
CREATE TABLE t
([StartTime] time, [ModifiedDate] datetime)
;
INSERT INTO t
([StartTime], [ModifiedDate])
VALUES
('20:00', '2019-06-10 01:04:17'),
('20:00', '2019-06-10 00:53:23'),
('20:00', '2019-06-10 00:51:09')
;
--we now have a table with a TIME column (cast it in the cte if yours is not), a DATETIME
with LOGS as (
select StartTime,
ModifiedDate,
DATEADD(DAY, -1, CAST(CAST(ModifiedDate as DATE) as DATETIME)) as ModifiedMidnightDayBefore,
CAST(StartTime as DateTime) as StartDateTime,
row_number() over (order by ModifiedDate) as num
from t
)
select curr.StartTime,
curr.ModifiedDate,
datediff(minute,
COALESCE(
prev.ModifiedDate,
curr.ModifiedMidnightDayBefore + curr.StartDateTime
),
curr.ModifiedDate) as BackupTime
from
LOGS curr
left join LOGS as prev on prev.num = curr.num - 1
order by curr.num
LOGS CTE присоединяется к себе в num = num-1, тем самым объединяя текущую строку и данные предыдущей строки в строку.В одной строке не будет предыдущих данных (пусто), поэтому, когда мы делаем наш datediff, мы используем coalesce, который похож на ISNULL, но поддерживается всеми основными поставщиками БД.COALESCE возвращает первый ненулевой аргумент.Он используется для заполнения значения, если для измененной даты нет значения PREVious
DATEDIFF предыдущего против текущего довольно очевидно.Хитрость заключается в логике, если нет предыдущего значения:
CTE также преобразует дату и время модифицированной даты в дату, чтобы отбросить компонент времени (установить его в полночь) и вернуться к дате (так чтопоявляется из dateadd как datetime).Dateadd вычитает один день из этого, поэтому в предыдущий день наступает полночь, а затем мы добавляем к этому наше время начала (8 вечера).Таким образом, минимальная дата в таблице преобразуется в полночь, возвращается на день назад, а затем добавляется 8 вечера, поэтому она становится «8 вечера в день, предшествующий измененной дате», и тогда мы можем точно установить это значение до 291 минуты