Comment soustraire 30 jours de la date / 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 toute personne qui ne souhaite pas utiliser DATE_SUB
, utilisez CURRENT_DATE
:
SELECT CURRENT_DATE - INTERVAL 30 DAY
NOW() - INTERVAL 30 DAY
. Puisque la question mentionne "soustraire 30 jours de la date et heure actuelle ", il se peut que ce ne soit pas ce que souhaite l'OP.current_timestamp
place decurrent_date
N'utilisons pas
NOW()
car vous perdez la mise en cache ou l'optimisation des requêtes, car la requête est différente à chaque fois. Consultez la liste des fonctions à ne pas utiliser dans la documentation MySQL .Dans le code ci-dessous, supposons que cette table augmente avec le temps. De nouveaux éléments sont ajoutés et vous souhaitez afficher uniquement ceux des 30 derniers jours. C'est le cas le plus courant.
Notez que la date a été ajoutée sous forme de chaîne. Il est préférable d'ajouter la date de cette manière, à partir de votre code d'appel, que d'utiliser la
NOW()
fonction car elle tue votre mise en cache.SELECT * FROM table WHERE exec_datetime >= DATE_SUB('2012-06-12', INTERVAL 30 DAY);
Vous pouvez l'utiliser
BETWEEN
si vous voulez vraiment juste des choses de cette seconde à 30 jours avant cette très 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.la source
NOW()
et de l'utiliser toujours dans votre réponse. o_O PS: votre requête renverrait un autre résultat, pas ce que OP veut probablementBETWEEN
et il>=
y a différents opérateurs, vous savez? Ma requête limite le jeu de résultats pour30 days ago AND today
cecieverything after 30 days ago
. Lestomorrow
enregistrements ne correspondent donc pas à la mienne et à votre requête d'origine, mais correspondront à cette réponseMySQL soustrait des jours à partir de maintenant:
select now(), now() - interval 1 day
Impressions:
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
la source
Vous pouvez aussi utiliser
select CURDATE()-INTERVAL 30 DAY
la source
SELECT date_format(current_date - INTERVAL 50 DAY,'%d-%b-%Y')
Vous pouvez formater en utilisant le format de date dans SQL.
la source
autrement
SELECT COUNT(*) FROM tbl_debug WHERE TO_DAYS(`when`) < TO_DAYS(NOW())-30 ;
la source
Si vous n'avez besoin que de la date et non de l'heure:
select*from table where exec_datetime between subdate(curdate(), 30)and curdate();
Puisque
curdate()
omet le composant de temps, il est potentiellement plus rapidenow()
et plus "sémantiquement correct" dans les cas où vous ne vous intéressez qu'à la date.En outre,
subdate()
la surcharge 2-arity de est potentiellement plus rapide que l'utilisationinterval
.interval
est destiné aux cas où vous avez besoin d'un composant non journalier.la source
subdate(curdate(), 30)
c'est plus rapide queCURRENT_DATE - INTERVAL 30 DAY
? Avez-vous une preuve? Et à quelle vitesse serait-ce? Quelques microsecondes?subdate
le fait d'être potentiellement plus rapide s'explique probablement, à votre avis, par sa "surcharge de 2 arités", mais pardonnez-moi s'il s'agit d'une question stupide, que signifient ces mots (par rapport à une fonction )? En particulier, qu'est-ce que la "2-arité"?curdate()
peut en fait être le mauvais choix, car l'OP semblait vouloir "soustraire 30 jours de la date- heure actuelle " (c'est moi qui souligne).