
Envoyé par
messi1987
Bonjour,
Svp je veux une fonction qui calcule la différence entre deux dates et qui retourne le résultat en jours
exp
1 2
|
'20/03/2014'-'01/02/2015'=312 |
Remarque : les deux dates sont ajoutées au calcule cad
mois de mars=11 jours
mois avril 2014 JUSQU'A 30/01/2015=10*30=300
mois de fevrier=1 jour
Total= 312 jours
ps mois=30 jours
Merci d'avance
Le mieux est toujours d'implémenter une table de date telle que je le préconise dans cet article : http://sqlpro.developpez.com/cours/gestiontemps/
Par exemple pour votre cas précis :
La table des dates :
1 2 3 4 5 6 7 8
| CREATE TABLE T_DAT
(DAT_DATE DATE PRIMARY KEY,
DAT_AN AS CAST(YEAR(DAT_DATE) AS SMALLINT) PERSISTED,
DAT_MOIS AS CAST(MONTH(DAT_DATE) AS TINYINT) PERSISTED,
DAT_JOUR AS CAST(DAY(DAT_DATE) AS TINYINT) PERSISTED,
DAT_NB_JOUR_FIN_MOIS TINYINT ,
DAT_JOUR_FIN_MOIS TINYINT
) |
Remplissage de la table avec date de 2000 à 2100 :
1 2 3 4 5 6 7 8 9
| SET NOCOUNT ON;
DECLARE @D DATE
SET @D = '2000-01-01'
WHILE @D < '2100-12-31'
BEGIN
INSERT INTO T_DAT (DAT_DATE) VALUES (@D);
SET @D = DATEADD(day, 1, @D)
END;
GO |
Mise à jour des colonnes pour nos calculs :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| WITH T0 AS
(
SELECT DAT_DATE, ROW_NUMBER() OVER(PARTITION BY DAT_AN, DAT_MOIS ORDER BY DAT_JOUR DESC) - 1 AS NB_JOUR_FIN_MOIS
FROM T_DAT
)
UPDATE T
SET DAT_NB_JOUR_FIN_MOIS = NB_JOUR_FIN_MOIS
FROM T_DAT AS T
INNER JOIN T0
ON T.DAT_DATE = T0.DAT_DATE;
GO
UPDATE T
SET DAT_JOUR_FIN_MOIS = T2.DAT_JOUR
FROM T_DAT AS T
INNER JOIN T_DAT AS T2
ON T.DAT_AN = T2.DAT_AN
AND T.DAT_MOIS = T2.DAT_MOIS
AND T2.DAT_NB_JOUR_FIN_MOIS = 0
GO |
Création de la fonction de calcul à jours de 30 mois :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| CREATE FUNCTION F_MOIS30 (@D1 DATE, @D2 DATE)
RETURNS INT
AS
BEGIN
DECLARE @AN INT, @MOIS INT, @JFM INT
SELECT @AN = DAT_AN, @MOIS = DAT_MOIS, @JFM = DAT_NB_JOUR_FIN_MOIS
FROM T_DAT
WHERE DAT_DATE = @D1;
SELECT @AN = DAT_AN - @AN, @MOIS = DAT_MOIS - @MOIS, @JFM = @JFM + DAT_JOUR
FROM T_DAT
WHERE DAT_DATE = @D2;
RETURN (@AN * 12 + @MOIS - 1) * 30 + @JFM
END;
GO |
Exemple d'utilisation :
SELECT dbo.F_MOIS30('2014-03-20', '2015-02-01')
Tout cela est bien entendu à tester !!!!
A +
Partager