2017-01-24 5 views
0

У меня есть следующие два примера назначенияSQL - Расчет продолжительности между TIME

enter image description here

Второе назначение длится с 7 вечера до полуночи. Однако продолжительность длится 19 часов. Это связано с тем, что дата не хранится и вычисляет разницу между 7 вечера и полуночью предыдущей ночи.

Назначения могут быть запланированы только до полуночи, так что есть ли какой-нибудь SQL, который увеличит день на 1 день, когда выберете, чтобы принять его полночь наступающей ночи, а не ночь раньше? Это должно быть только аффективным, когда время полночь, иначе оно отлично работает.

Текущий SQL

select mr.AssignmentId, ABS(DATEDIFF(MINUTE, mr.AssignmentStart, mr.AssignmentEnd) /60.0) as Total 

from master_rota mr 

enter image description here

+0

Почему приложение не делает вставки, устанавливающие время окончания до нужного времени? Или эти столбцы TIME получают форматирование в виде столбцов datetime в кеше экрана? –

+0

Вы понимаете, что полночь (00:00:00) - это начало дня, а не конец дня, правильно? –

ответ

3

Ну, не используйте abs():

select mr.AssignmentId, 
     (case when mr.AssignmentStart < AssignmentEnd 
      then DATEDIFF(MINUTE, mr.AssignmentStart, mr.AssignmentEnd)/60.0 
      else 24 + DATEDIFF(MINUTE, mr.AssignmentStart, mr.AssignmentEnd)/60.0 
     end) as Total 
from master_rota mr; 

На самом деле, я думаю, что я предпочитаю эту эквивалентную версию:

select mr.AssignmentId, 
     (DATEDIFF(MINUTE, mr.AssignmentStart, mr.AssignmentEnd)/60.0 + 
     (case when mr.AssignmentStart < AssignmentEnd then 0 else 24 end) 
     ) as Total 
from master_rota mr; 

У этого есть datediff() в одном месте.

0

Вы должны получить свое приложение, выполняющее вставки, чтобы на самом деле выполнить правильную логику вставки. Тем не менее, кажется, что это может быть обходной путь:

SELECT mr.AssignmentId 
    , DATEDIFF(MINUTE, mr.AssignmentStart, 
     CASE WHEN mr.AssignmentEnd < mr.AssignmentStart THEN mr.AssignmentEnd + 1 ELSE mr.AssignmentEnd END) /60.0 as Total  
FROM master_rota mr 
+0

Да, справа, я изменил вставку, чтобы сделать это, а не делать это в SQL –

0

Если это полночь, изменение 00:00:00 следующий день

select ABS(DATEDIFF(MINUTE, mr.AssignmentStart, iif(mr.AssignmentEnd='1900-01-01 00:00:00', '1900-01-02 00:00:00', mr.AssignmentEnd)) /60.0) as Total 

from #temp mr 
0

Просто добавьте в день, если AssignmentEnd полночь (00 : 00).

SELECT mr.AssignmentId, 
    CASE WHEN mr.AssignmentEnd = '00:00' 
     THEN DATEDIFF(MINUTE, mr.AssignmentStart, DATEADD(DAY, 1, mr.AssignmentEnd))/60.0 
     ELSE DATEDIFF(MINUTE, mr.AssignmentStart, mr.AssignmentEnd)/60.0 
    END AS Total 
from master_rota mr; 
Смежные вопросы