La différence en nombre de mois entre deux dates dans MySQL
Je cherche à calculer le nombre de mois entre 2 date de champs.
Est-il un meilleur moyen que d'obtenir le timestamp unix et la divisant par 2 592 000 (en secondes) et en arrondissant au sein de MySQL?
Vous devez vous connecter pour publier un commentaire.
La DATEDIFF fonction peut vous donner le nombre de jours entre deux dates. Ce qui est plus précis, car... comment définissez-vous un mois? (28, 29, 30 ou 31 jours?)
PERIODDIFF
prend simplement une AAAAMM valeur, donc à moins que tu compte pour les jours à vous-même avant de passer à l'AAAAMM valeurs, puis tous que vous êtes le calcul est le nombre de mois, arrondie à la mois si il est inférieur à un nombre entier de mois. Voir Zane de réponse ci-dessous.PERIODDIFF
commentaire? Perioddiff ne pas prendre des valeurs de jour, de sorte que vous êtes le calcul du nombre de mois arrondie à la mois si il est inférieur à un nombre entier de moisMois-différence entre le donné deux dates:
Je suis surpris que cela n'a pas encore été mentionnés:
Ont un look à la TIMESTAMPDIFF() fonction dans MySQL.
Ce que cela vous permet de passer dans deux
TIMESTAMP
ouDATETIME
valeurs (ou mêmeDATE
comme MySQL conversion automatique) ainsi que l'unité de temps vous souhaitez baser votre différence sur.Vous pouvez spécifier
MONTH
que l'unité dans le premier paramètre:Essentiellement, il obtient le nombre de mois écoulés depuis la première date dans la liste des paramètres. Cette solution compense automatiquement la quantité variable de jours dans chaque mois (28,30,31) ainsi que la prise en compte des années bissextiles — vous n'avez pas à vous soucier de ce genre de trucs.
Mois de différence avec précision:
C'est un peu plus compliqué si vous voulez introduire une précision décimale du nombre de mois écoulés, mais ici, c'est comment vous pouvez le faire:
Où
startdate
etenddate
sont vos paramètres de date, que ce soit à partir de deux colonnes de date dans une table ou comme paramètres d'entrée à partir d'un script:Exemples:
PERIODDIFF
commentaire sur la réponse sélectionnée sont très mlle de pointePERIOD_DIFF calcule mois entre deux dates.
Par exemple, pour calculer la différence entre maintenant() et une colonne de temps en your_table:
J'utilise aussi PERIODDIFF. Pour obtenir l'année et le mois de la date, j'utilise la fonction EXTRAIT:
DATE_FORMAT
méthode, merci! +1SELECT PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM NOW()), EXTRACT(YEAR_MONTH FROM FROM_UNIXTIME(time, "%Y%m%d"))) AS months FROM your_table;
PERIOD_DIFF
ne pas prendre des valeurs de jour, de sorte que vous êtes le calcul du nombre de mois arrondie à la mois si il est inférieur à un nombre entier de mois. Vous devez modifier votre réponse claire à ce sujet.Je préfère cette façon, parce que tous ceux comprendrez clairement au premier coup d'œil:
Que beaucoup de réponses ici le montrent, la "bonne" réponse dépend exactement ce dont vous avez besoin. Dans mon cas, j'ai besoin de tour la plus proche nombre entier.
Considérez ces exemples:
1er janvier -> le 31 janvier: C'est 0 mois entiers, et de presque 1 mois.
1er janvier -> 1er février? C'est 1 mois entier, et exactement 1 mois.
Pour obtenir le nombre de ensemble (complète) mois, utilisation:
Pour obtenir un arrondie durée en mois, vous pouvez utiliser:
C'est précis à +/- 5 jours et pour des gammes de plus de 1000 ans. Zane la réponse est évidemment plus précise, mais il est trop bavard à mon goût.
De manuel MySQL:
De sorte qu'il peut être possible de faire quelque chose comme ceci:
Où d1 et d2 sont de la date d'expressions.
J'ai eu à utiliser le si() déclarations assurez-vous que le mois est un nombre à deux chiffres comme 02, plutôt que 2.
Est-il un meilleur moyen?
oui. Ne pas utiliser MySQL Horodateurs. Outre le fait qu'elles occupent 36 Octets, ils ne sont pas du tout commode de travailler avec.
Je recommanderais à l'aide de Julian Date et les Secondes à partir de minuit pour toutes les valeurs de date/heure.
Ceux-ci peuvent être combinés pour former un UnixDateTime. Si celui-ci est stocké dans un DWORD (unsigned 4 Octets Entier) puis remonte tout le chemin jusqu'à 2106 peut être stockée en secondes depuis l'epoc, 01/01/1970
DWORD max val = 4,294,967,295 - UN DWORD peut contenir 136 ans de Secondes
Les Dates juliennes sont très agréable de travailler avec lors de la prise de calculs de date
UNIXDateTime valeurs sont bonnes pour travailler avec lors de la prise de Date/Heure calculs
Ni sont agréable à regarder, donc j'utilise le timestamp quand j'ai besoin d'une colonne que je ne vais pas faire trop de calculs, mais je veux un en un coup d'œil indication.
La conversion à Julian et à l'arrière peut être fait très rapidement dans une bonne langue. En utilisant les pointeurs, j'ai descendu à environ 900 Clks (C'est aussi une conversion d'une CHAÎNE en ENTIER de cours)
Lorsque vous obtenez des sérieusement les applications qui utilisent les informations de Date/Heure comme par exemple les marchés financiers, les dates Juliennes sont de facto.
La Requête sera comme:
Donne un certain nombre de mois de calendrier depuis la création datestamp sur un dossier client, de la location de MySQL ne la sélection du mois en interne.
Exécuter ce code et il va créer une fonction datedeifference qui vous donnera la différence de format de date aaaa-mm-jj.
Cela dépend de comment vous voulez que le # de mois pour être définis. Répondre à cette question: "Quelle est la différence en mois: Février 15, 2008 - Mar 12, 2009'. Est-il défini par claire # de jours qui dépend des années bissextiles - ce mois-ci, il est, ou même jour du mois précédent = 1 mois.
Un calcul pour les Jours:
Fév 15 -> 29 (année bissextile) = 14
Mar 1, 2008 + 365 = Mar 1, 2009.
Mar 1 -> Mar 12 = 12 jours.
14 + 365 + 12 = 391 jours.
Total = 391 jours /(avg jours dans le mois = 30) = 13.03333
Un calcul de mois:
15 Février 2008 Au 15 Février 2009 = 12
Feb 15 -> Mar 12 = moins de 1 mois
Total = 12 mois, ou 13 si fév 15 - mar 12 est considéré comme le mois passé'
J'avais besoin de mois de différence avec précision. Bien que Zane Bien la solution est dans la bonne direction, ses deuxième et troisième exemples de donner des résultats inexacts. Un jour de février, divisé par le nombre de jours de février n'est pas égal à un jour de Mai, divisé par le nombre de jours de Mai. Donc le deuxième exemple devrait en sortie ((31-5+1)/31 + 13/30 = ) 1.3043 et le troisième exemple ((29-27+1)/29 + 2/30 + 3 = ) 3.1701.
J'ai fini avec la requête suivante:
Vous pouvez obtenir des années, les mois et les jours de cette façon:
Vous pouvez aussi essayer ceci:
OU
PERIOD_DIFF() la fonction
L'un de la façon dont est MySQL PERIOD_DIFF() retourne la différence entre les deux périodes. Les périodes doivent être dans le même format, c'est à dire AAAAMM ou YYMM. Il est à noter que les périodes ne sont pas les valeurs de date.
Code:
Simple réponse donnée date de début ins_frm et la date de fin comme ins_to
Profiter :)))
Essayer cette
Cette requête a fonctionné pour moi:)
Il suffit de prendre deux dates et récupère les valeurs entre elles.