Je cherche à calculer le nombre de mois entre 2 champs de date et heure.
Existe-t-il un meilleur moyen que de récupérer l'horodatage unix, de le diviser par 2 592 000 (secondes) et de l'arrondir dans MySQL ?
Je cherche à calculer le nombre de mois entre 2 champs de date et heure.
Existe-t-il un meilleur moyen que de récupérer l'horodatage unix, de le diviser par 2 592 000 (secondes) et de l'arrondir dans MySQL ?
Je suis surpris que cela n'ait pas encore été mentionné :
Jetez un coup d'œil à la TIMESTAMPDIFF() dans MySQL.
Ce que cela vous permet de faire est de passer dans deux TIMESTAMP
o DATETIME
(ou même DATE
car MySQL effectuera une conversion automatique) ainsi que l'unité de temps sur laquelle vous souhaitez baser votre différence.
Vous pouvez spécifier MONTH
comme l'unité du premier paramètre :
SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-04')
-- Outputs: 0
SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-05')
-- Outputs: 1
SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-15')
-- Outputs: 1
SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-12-16')
-- Outputs: 7
Il s'agit essentiellement d'obtenir le nombre de mois écoulés depuis la première date de la liste de paramètres. Cette solution compense automatiquement le nombre variable de jours dans chaque mois (28, 30, 31) et prend en compte les années bissextiles - vous n'avez pas à vous préoccuper de tout cela.
C'est un peu plus compliqué si vous voulez introduire une précision décimale dans le nombre de mois écoulés, mais voici comment vous pouvez le faire :
SELECT
TIMESTAMPDIFF(MONTH, startdate, enddate) +
DATEDIFF(
enddate,
startdate + INTERVAL
TIMESTAMPDIFF(MONTH, startdate, enddate)
MONTH
) /
DATEDIFF(
startdate + INTERVAL
TIMESTAMPDIFF(MONTH, startdate, enddate) + 1
MONTH,
startdate + INTERVAL
TIMESTAMPDIFF(MONTH, startdate, enddate)
MONTH
)
Où startdate
y enddate
sont vos paramètres de date, que ce soit à partir de deux colonnes de date dans un tableau ou comme paramètres d'entrée d'un script :
Exemples :
With startdate = '2012-05-05' AND enddate = '2012-05-27':
-- Outputs: 0.7097
With startdate = '2012-05-05' AND enddate = '2012-06-13':
-- Outputs: 1.2667
With startdate = '2012-02-27' AND enddate = '2012-06-02':
-- Outputs: 3.1935
C'est la bonne réponse, tous les votes positifs pour le PERIODDIFF
le commentaire sur la réponse choisie est très trompeur.
Merci, dans mon cas j'avais besoin de dates inclusives, donc je remplace tous les "enddate" par "date_add(enddate,interval 1 day)". Alors 2014-03-01 à 2014-05-31 donnera 3.00 au lieu de 2.97.
Merci beaucoup.....special thanx pour "Month-difference with precision :". Vous êtes la star de mysql
PERIOD_DIFF calcule les mois entre deux dates.
Par exemple, pour calculer la différence entre now() et une colonne de temps dans votre_table :
select period_diff(date_format(now(), '%Y%m'), date_format(time, '%Y%m')) as months from your_table;
J'utilise aussi PERIOD_DIFF . Pour obtenir l'année et le mois de la date, j'utilise la fonction EXTRACT :
SELECT PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM NOW()), EXTRACT(YEAR_MONTH FROM time)) AS months FROM your_table;
Ici pour un timestamp unix SELECT PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM NOW()), EXTRACT(YEAR_MONTH FROM FROM_UNIXTIME(time, "%Y%m%d"))) AS months FROM your_table;
Ceci est incorrect, PERIOD_DIFF
ne prend pas la valeur des jours, vous calculez donc le nombre de mois, arrondi au mois le plus proche s'il y a moins d'un nombre entier de mois. Vous devez modifier votre réponse pour que cela soit clair.
En DATEDIFF peut vous donner le nombre de jours entre deux dates. Ce qui est plus précis, puisque... comment définir un mois (28, 29, 30 ou 31 jours) ?
"Plus précis" est incroyablement subjectif lorsqu'il s'agit de dates. Si, par exemple, vous êtes dans une entreprise qui a des cycles mensuels, le besoin de savoir combien de mois séparent deux dates peut être plus important que le nombre de jours pour la raison même que vous avez exposée ci-dessus. Quelle est la durée d'un mois ? Si j'ai besoin du nombre de mois, je ne peux pas simplement diviser par 30.
Stanislav - cette méthode est tout à fait appropriée si vous voulez connaître les données PAR NUMÉRO DE MOIS. J'ai quelques rapports qui montrent les ventes par mois (Jan/Feb/Mar etc) mais il y a tellement de données (graphiques par trimestre/année/années précédentes etc) que je ne peux pas grouper par quoi que ce soit. J'ai besoin d'extraire les données brutes et de les parcourir en boucle - lorsqu'on est le 31 janvier, de nombreux calculs placent le "mois prochain" en mars alors que nous, les humains, savons qu'il s'agit de février. Si on est le 2/4, certains calculs disent que le 31 janvier est "ce mois-ci" mais que le 18 janvier était "le mois dernier".
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.