CALCUL UNE DIFFÉRENCE DE DATE EN FONCTION DE JOURS FÉRIÉS/TRAVAILLÉS ET DE PLAGE

dymsbess 62 Messages postés mercredi 29 septembre 2004Date d'inscription 4 janvier 2010 Dernière intervention - 10 juin 2009 à 09:44 - Dernière réponse :  kyaume
- 13 déc. 2017 à 16:49
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

http://codes-sources.commentcamarche.net/source/50022-calcul-une-difference-de-date-en-fonction-de-jours-feries-travailles-et-de-plage-horaire

Afficher la suite 
dymsbess 62 Messages postés mercredi 29 septembre 2004Date d'inscription 4 janvier 2010 Dernière intervention - 10 juin 2009 à 09:44
Voici une fontion complétaire permettant de ressortir la liste des jours fériés pour l'année en cours : http://www.xoowiki.com/Article/SQL-Server/liste-des-jours-feries-47.aspx
wajdi0001 1 Messages postés dimanche 26 avril 2009Date d'inscription 22 septembre 2010 Dernière intervention - 22 sept. 2010 à 12:16
Avez vous une estimation sur le temps d'exécution de cette fonction? (pour 1000 dates par exemple)
cs_Sieurcoug 10 Messages postés jeudi 26 février 2009Date d'inscription 16 avril 2012 Dernière intervention - 23 sept. 2010 à 09:54
> Avez vous une estimation sur le temps d'exécution de cette fonction? (pour 1000 dates par exemple)

Ca dépend des ressources...
Pour moi le calcul est très rapide, sur plusieurs centaines, voire millier d'enregistrement.
Bonjour,
Merci pour la proc stock et les heures de debug qui vont avec
Il faut tenir compte dans le calcul des cas ou la date de fin est hors plage ou un jour non travailler. comme ci-dessous :
USE [PoleHorsSAP]
GO
/****** Object: UserDefinedFunction [dbo].[FN_DATEDIFF_SELON_HORAIRES_ENTREPRISE] Script Date: 01/10/2014 18:52:12 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[FN_DATEDIFF_SELON_HORAIRES_ENTREPRISE] (@Date1 DATETIME, @Date2 DATETIME)
RETURNS INT AS
BEGIN
DECLARE @DateCreCalcul DATETIME
DECLARE @DateCre2Calcul DATETIME
DECLARE @NbJourneesNonTravaillees INT
DECLARE @NbNuits INT
DECLARE @LSTTEST VARCHAR
DECLARE @LSTTESTT VARCHAR

SET @DateCreCalcul = @Date1
-- Si Date1 inférieure à l'heure d'ouverture
IF DATEPART(hour, @Date1) < 9
BEGIN
SET @DateCreCalcul = DATEADD(hour, - DATEPART(hour, @Date1) + 9, @Date1)
SET @DateCreCalcul = DATEADD(minute, - DATEPART(minute, @DateCreCalcul), @DateCreCalcul)
SET @DateCreCalcul = DATEADD(second, - DATEPART(second, @DateCreCalcul), @DateCreCalcul)
SET @DateCreCalcul = DATEADD(millisecond, - DATEPART(millisecond, @DateCreCalcul), @DateCreCalcul)
END
-- Si Date2 inférieure à l'heure d'ouverture
IF DATEPART(hour, @Date2) < 9
BEGIN
SET @DateCre2Calcul = DATEADD(hour, - DATEPART(hour, @Date2) + 9, @Date2)
SET @DateCre2Calcul = DATEADD(minute, - DATEPART(minute, @DateCre2Calcul), @DateCre2Calcul)
SET @DateCre2Calcul = DATEADD(second, - DATEPART(second, @DateCre2Calcul), @DateCre2Calcul)
SET @DateCre2Calcul = DATEADD(millisecond, - DATEPART(millisecond, @DateCre2Calcul), @DateCre2Calcul)
END
-- Si Date1 supérieure à l'heure de fermeture
IF DATEPART(hour, @Date1) >= 18 BEGIN
SET @DateCreCalcul = DATEADD(hour, - DATEPART(hour, @Date1) + 18, @Date1)
SET @DateCreCalcul = DATEADD(minute, - DATEPART(minute, @DateCreCalcul), @DateCreCalcul)
SET @DateCreCalcul = DATEADD(second, - DATEPART(second, @DateCreCalcul), @DateCreCalcul)
SET @DateCreCalcul = DATEADD(millisecond, - DATEPART(millisecond, @DateCreCalcul), @DateCreCalcul)
END
-- Si Date2 supérieure à l'heure de fermeture
IF DATEPART(hour, @Date2) >= 18 BEGIN
SET @DateCre2Calcul = DATEADD(hour, - DATEPART(hour, @Date2) + 18, @Date2)
SET @DateCre2Calcul = DATEADD(minute, - DATEPART(minute, @DateCre2Calcul), @DateCre2Calcul)
SET @DateCre2Calcul = DATEADD(second, - DATEPART(second, @DateCre2Calcul), @DateCre2Calcul)
SET @DateCre2Calcul = DATEADD(millisecond, - DATEPART(millisecond, @DateCre2Calcul), @DateCre2Calcul)
END
-- Si Date1 est un dimanche, on ajoute 1 jour et on commence à l'heure d'ouverture
IF DatePart(weekday, @Date1) = 7 BEGIN
SET @DateCreCalcul = DATEADD(day, 1, @DateCreCalcul)
SET @DateCreCalcul = DATEADD(hour, - DATEPART(hour, @DateCreCalcul) + 9, @DateCreCalcul)
SET @DateCreCalcul = DATEADD(minute, - DATEPART(minute, @DateCreCalcul), @DateCreCalcul)
SET @DateCreCalcul = DATEADD(second, - DATEPART(second, @DateCreCalcul), @DateCreCalcul)
SET @DateCreCalcul = DATEADD(millisecond, - DATEPART(millisecond, @DateCreCalcul), @DateCreCalcul)
END
-- Si Date2 est un dimanche, on ajoute 1 jour et on commence à l'heure d'ouverture
IF DatePart(weekday, @Date2) = 7 BEGIN
SET @DateCre2Calcul = DATEADD(day, 1, @DateCre2Calcul)
SET @DateCre2Calcul = DATEADD(hour, - DATEPART(hour, @DateCre2Calcul) + 9, @DateCre2Calcul)
SET @DateCre2Calcul = DATEADD(minute, - DATEPART(minute, @DateCre2Calcul), @DateCre2Calcul)
SET @DateCre2Calcul = DATEADD(second, - DATEPART(second, @DateCre2Calcul), @DateCre2Calcul)
SET @DateCre2Calcul = DATEADD(millisecond, - DATEPART(millisecond, @DateCre2Calcul), @DateCre2Calcul)
END
-- Si Date1 est un samedi, on ajoute 2 jours et on commence à l'heure d'ouverture
IF DatePart(weekday, @Date1) = 6 BEGIN
SET @DateCreCalcul = DATEADD(day, 2, @DateCreCalcul)
SET @DateCreCalcul = DATEADD(hour, - DATEPART(hour, @DateCreCalcul) + 9, @DateCreCalcul)
SET @DateCreCalcul = DATEADD(minute, - DATEPART(minute, @DateCreCalcul), @DateCreCalcul)
SET @DateCreCalcul = DATEADD(second, - DATEPART(second, @DateCreCalcul), @DateCreCalcul)
SET @DateCreCalcul = DATEADD(millisecond, - DATEPART(millisecond, @DateCreCalcul), @DateCreCalcul)
END
-- Si Date2 est un samedi, on ajoute 2 jours et on commence à l'heure d'ouverture
IF DatePart(weekday, @Date2) = 6 BEGIN
SET @DateCre2Calcul = DATEADD(day, 2, @DateCre2Calcul)
SET @DateCre2Calcul = DATEADD(hour, - DATEPART(hour, @DateCre2Calcul) + 9, @DateCre2Calcul)
SET @DateCre2Calcul = DATEADD(minute, - DATEPART(minute, @DateCre2Calcul), @DateCre2Calcul)
SET @DateCre2Calcul = DATEADD(second, - DATEPART(second, @DateCre2Calcul), @DateCre2Calcul)
SET @DateCre2Calcul = DATEADD(millisecond, - DATEPART(millisecond, @DateCre2Calcul), @DateCre2Calcul)
END

SET @NbJourneesNonTravaillees = 0
SET @NbNuits = DATEDIFF(day, @DateCreCalcul, @DateCre2Calcul)
-- Si les 2 dates sont à des jours différents, on cherche le nombre de jours NON travaillés entre les 2 dates
DECLARE @Compteur_NbNuits int;
SET @Compteur_NbNuits = 0;

-- Dans une boucle, on balaye tous les jours entre les 2 dates pour compter le nombre de jours non travaillés
WHILE @Compteur_NbNuits < @NbNuits
BEGIN
SET @Compteur_NbNuits = @Compteur_NbNuits + 1;
SET @LSTTEST = dbo.FN_JourTravailleFerie(DATEADD(day, @Compteur_NbNuits, @DateCreCalcul), 1)
IF @LSTTEST <> 'X'
BEGIN
SET @NbJourneesNonTravaillees = @NbJourneesNonTravaillees + 1
END
END

-- On calcule la différence en minutes et on retire :
-- - la durée des des nuits en minutes
-- - la durée des journées non travaillées en minutes
RETURN datediff(minute, @DateCreCalcul, @DateCre2Calcul) - 900*@NbNuits - 540*@NbJourneesNonTravaillees

END
Commenter la réponse de dymsbess

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.