J'ai les deux exemples de rendez-vous ci-dessous

enter image description here

Le deuxième rendez-vous se déroule de 19h à minuit. Cependant, la durée revient à 19 heures. Cela est dû au fait que la date n'est pas enregistrée et qu'il calcule la différence entre 19h et minuit de la nuit précédente.

De toute façon, les rendez-vous ne peuvent être planifiés que jusqu'à minuit, alors y a-t-il du SQL qui augmentera la journée d'un jour lorsque vous choisissez d'assumer le minuit de la nuit à venir et non la nuit précédente? Cela ne devrait être affectif que lorsqu'il est minuit, sinon cela fonctionne bien.

SQL actuel

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

from master_rota mr

enter image description here

0
David Hayward 24 janv. 2017 à 17:35

4 réponses

Meilleure réponse

Eh bien, n'utilisez pas 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;

En fait, je pense que je préfère cette version équivalente:

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;

Il a le datediff() en un seul endroit.

3
Gordon Linoff 24 janv. 2017 à 14:39

Vous devriez demander à votre application de faire les insertions pour effectuer la logique d'insertion correcte. Cependant, il semble que cela pourrait être une solution de contournement:

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
Dan Field 24 janv. 2017 à 14:40

S'il est minuit, passez à 00:00:00 le lendemain

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
cloudsafe 24 janv. 2017 à 14:47

Ajoutez simplement un jour si AssignmentEnd est minuit (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;
0
Isaac 24 janv. 2017 à 14:48