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).
Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
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,
Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
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)
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
* * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *
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 !
Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
Partager