Comment soustraire 30 jours de la date et l'heure actuelle dans mysql?
SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();
SELECT * FROM table
WHERE exec_datetime BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY) AND NOW();
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-add
Pour ceux qui ne veulent pas utiliser DATE_SUB
, utilisez CURRENT_DATE
:
SELECT CURRENT_DATE - INTERVAL 30 DAY
N'utilisons pas NOW()
car vous perdez toute mise en cache ou optimisation de requête, car la requête est différente à chaque fois. Consultez la liste des fonctions que vous ne devriez pas utiliser dans le documentation MySQL .
Dans le code ci-dessous, supposons que ce tableau grandit avec le temps. De nouveaux éléments sont ajoutés et vous souhaitez afficher uniquement les éléments des 30 derniers jours. C'est le cas le plus fréquent.
Notez que la date a été ajoutée en tant que chaîne. Il est préférable d’ajouter la date de cette façon, à partir de votre code d’appel, plutôt que d’utiliser la fonction NOW()
car elle supprime la mise en cache.
SELECT * FROM table WHERE exec_datetime >= DATE_SUB('2012-06-12', INTERVAL 30 DAY);
Vous pouvez utiliser BETWEEN
si vous voulez vraiment des choses de cette seconde à 30 jours avant cette seconde, mais ce n'est pas un cas d'utilisation courant dans mon expérience, donc j'espère que la requête simplifiée pourra bien vous servir.
Vous pouvez aussi utiliser
select CURDATE()-INTERVAL 30 DAY
MySQL soustrayez les jours à partir de maintenant:
select now(), now() - interval 1 day
Impressions:
2014-10-08 09:00:56 2014-10-07 09:00:56
Autres arguments d'unité d'expression temporelle d'intervalle:
https://dev.mysql.com/doc/refman/5.5/en/expressions.html#temporal-intervals
select now() - interval 1 microsecond
select now() - interval 1 second
select now() - interval 1 minute
select now() - interval 1 hour
select now() - interval 1 day
select now() - interval 1 week
select now() - interval 1 month
select now() - interval 1 year
SELECT date_format(current_date - INTERVAL 50 DAY,'%d-%b-%Y')
Vous pouvez formater en utilisant le format de date en SQL.
autrement
SELECT COUNT(*) FROM tbl_debug WHERE TO_DAYS(`when`) < TO_DAYS(NOW())-30 ;
Si vous avez seulement besoin de la date et non de l'heure, utilisez:
select*from table where exec_datetime
between subdate(curdate(), 30)and curdate();
Puisque curdate()
omet la composante heure, il est potentiellement plus rapide que now()
et plus "sémantiquement correct" dans les cas où vous êtes seulement intéressé par la date.
De plus, la surcharge 2-entités de subdate()
est potentiellement plus rapide que d'utiliser interval
. interval
est destiné aux cas où vous avez besoin d'un composant non journalier.