1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| DECLARE @TABLE TABLE (EVT INT, DATE_DEB DATETIME, DATE_FIN DATETIME)
-- Cas simple
INSERT @TABLE SELECT 1, '15/08/2016 09:00:00.000', '16/08/2016 09:00:00.000'
-- Cas de changement de semaine
INSERT @TABLE SELECT 2, '05/08/2016 09:00:00.000', '08/08/2016 09:00:00.000'
-- Cas de début un samedi
INSERT @TABLE SELECT 3, '06/08/2016 09:00:00.000', '08/08/2016 09:00:00.000'
-- Cas de début un dimanche
INSERT @TABLE SELECT 4, '07/08/2016 09:00:00.000', '08/08/2016 09:00:00.000'
-- Cas de fin un samedi
INSERT @TABLE SELECT 5, '05/08/2016 09:00:00.000', '06/08/2016 09:00:00.000'
-- Cas de fin un dimanche
INSERT @TABLE SELECT 6, '05/08/2016 09:00:00.000', '07/08/2016 09:00:00.000'
-- Cas de début un samedi et de fin un dimanche
INSERT @TABLE SELECT 7, '06/08/2016 09:00:00.000', '07/08/2016 09:00:00.000'
-- Cas de début un samedi et de fin un samedi
INSERT @TABLE SELECT 8, '06/08/2016 09:00:00.000', '06/08/2016 09:00:00.000'
-- Cas de début un dimanche et de fin un dimanche
INSERT @TABLE SELECT 9, '07/08/2016 09:00:00.000', '07/08/2016 09:00:00.000'
-- Cas de reset du numéro de semaine
-- le 01/01/2016 nous étions semaine 53 et le 04/01/2016 semaine 1
INSERT @TABLE SELECT 10, '01/01/2016 09:00:00.000', '04/01/2016 09:00:00.000'
SELECT EVT,
DATE_DEB,
DATE_FIN,
DATENAME(dw, DATE_DEB) AS JOUR_DEB,
DATEPART(ISO_WEEK,DATE_DEB) AS SEM_DEB,
DATENAME(dw, DATE_FIN) AS JOUR_FIN,
DATEPART(ISO_WEEK,DATE_FIN) AS SEM_FIN,
-- Diff en nd de jours entre deux dates
DATEDIFF(d, DATE_DEB, DATE_FIN) -- Suppression de 2 jours par semaines
- 2 * (DATEPART(ISO_WEEK,DATE_FIN) - DATEPART(ISO_WEEK,DATE_DEB)) -- Tout evt débutant le dimanche est considéré comme débutant le lundi (idem pour le samedi mais pas d'exception à gérer)
+ (CASE WHEN DATEPART(dw, DATE_DEB) = 7 THEN 1 ELSE 0 END) -- Tout evt terminant le dimanche est considéré comme terminant le lundi (idem pour le samedi mais pas d'exception à gérer)
- (CASE WHEN DATEPART(dw, DATE_FIN) = 7 THEN 1 ELSE 0 END)
AS DureeJour
FROM @TABLE |
Partager