Bonjour,
J'ai besoin de calculer le nombre de mois entre la date du 01-2009 et des dates d'ouvertures de demandes.
Par exemple avec une demande ayant été ouverte en septembre 2008, arriver à calculer 5.
Merci,
Elodie
Bonjour,
J'ai besoin de calculer le nombre de mois entre la date du 01-2009 et des dates d'ouvertures de demandes.
Par exemple avec une demande ayant été ouverte en septembre 2008, arriver à calculer 5.
Merci,
Elodie
il existe une fonction MONTH_BETWEEN(date1, date2).
SQL Server implémente la fonction DateDiff
Code : Sélectionner tout - Visualiser dans une fenêtre à part select datediff(month, '2008-10-01','2009-01-15')
J'ai utilisé les MONTHS_BETWEEN mais dans le group by que faut-il mettre parce que j'ai l'erreur not a group by expression ?
Merci,
Ok excusez moi.
Enfait du coup ça m'a permis de trouver l'erreur qui était dans un autre select imbriqué. Merci !
De manière normalisée on peut faire
A +
Code : Sélectionner tout - Visualiser dans une fenêtre à part CAST(CAST('2008-10-01' AS DATE) - CAST('2009-01-15' AS DATE) AS INTERVAL MONTH)
Pour info, ayant été confronté au même calcul sous MySQL qui ne donne une DATEDIFF qu'en jours et qui ne connait pas MONTH_BETWEEN, j'ai fait la requête ci-dessous pour calculer le nombre de mois entre la date de premier vêlage d'une vache et sa date de naissance.
Petite précision :
Une vache née par exemple le 24/07/1972 et qui vêle le :
- 10/07/1975 a 35 mois
- 24/07/1975 a 36 mois
- 10/08/1075 a 36 mois
- 24/08/1075 a 37 mois
Autrement dit le nombre de mois change à jour anniversaire.
Voici la requête :
Pour la petite histoire, sur une table de 67 millions de bovins, cette requête retourne un résultat de 15 millions de lignes en une vingtaine de secondes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 SELECT B_IND_BOVIN, B_DAT_PREM_VELAGE, B_DAT_NAISS, CASE WHEN MONTH(B_DAT_PREM_VELAGE) <= MONTH(B_DAT_NAISS) AND DAY(B_DAT_PREM_VELAGE) < DAY(B_DAT_NAISS) THEN ((YEAR(B_DAT_PREM_VELAGE) - YEAR(B_DAT_NAISS) - 1) * 12) + MONTH(B_DAT_PREM_VELAGE) - MONTH(B_DAT_NAISS) + 11 WHEN MONTH(B_DAT_PREM_VELAGE) < MONTH(B_DAT_NAISS) AND DAY(B_DAT_PREM_VELAGE) >= DAY(B_DAT_NAISS) THEN ((YEAR(B_DAT_PREM_VELAGE) - YEAR(B_DAT_NAISS) - 1) * 12) + MONTH(B_DAT_PREM_VELAGE) - MONTH(B_DAT_NAISS) + 12 WHEN MONTH(B_DAT_PREM_VELAGE) = MONTH(B_DAT_NAISS) AND DAY(B_DAT_PREM_VELAGE) >= DAY(B_DAT_NAISS) THEN ((YEAR(B_DAT_PREM_VELAGE) - YEAR(B_DAT_NAISS)) * 12) WHEN MONTH(B_DAT_PREM_VELAGE) > MONTH(B_DAT_NAISS) AND DAY(B_DAT_PREM_VELAGE) < DAY(B_DAT_NAISS) THEN ((YEAR(B_DAT_PREM_VELAGE) - YEAR(B_DAT_NAISS)) * 12) + MONTH(B_DAT_PREM_VELAGE) - MONTH(B_DAT_NAISS) - 1 WHEN MONTH(B_DAT_PREM_VELAGE) > MONTH(B_DAT_NAISS) AND DAY(B_DAT_PREM_VELAGE) >= DAY(B_DAT_NAISS) THEN ((YEAR(B_DAT_PREM_VELAGE) - YEAR(B_DAT_NAISS)) * 12) + MONTH(B_DAT_PREM_VELAGE) - MONTH(B_DAT_NAISS) ELSE NULL END AS NbMoisAPremVelage FROM bdni2.bovins WHERE B_DAT_PREM_VELAGE IS NOT NULL AND B_DAT_PREM_VELAGE <> '0000-00-00'
Pas d'affolement sur la complexité apparente de la requête !
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager