Comment soustraire 30 jours de la date / heure actuelle dans mysql?
SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();
Comment soustraire 30 jours de la date / heure actuelle dans mysql?
SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();
Réponses:
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.
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 probablement
BETWEEN
et il >=
y a différents opérateurs, vous savez? Ma requête limite le jeu de résultats pour 30 days ago AND today
ceci everything after 30 days ago
. Les tomorrow
enregistrements ne correspondent donc pas à la mienne et à votre requête d'origine, mais correspondront à cette réponse
MySQL soustrait des 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
Vous pouvez aussi utiliser
select CURDATE()-INTERVAL 30 DAY
SELECT date_format(current_date - INTERVAL 50 DAY,'%d-%b-%Y')
Vous pouvez formater en utilisant le format de date dans SQL.
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 rapide now()
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'utilisation interval
.
interval
est destiné aux cas où vous avez besoin d'un composant non journalier.
subdate(curdate(), 30)
c'est plus rapide que CURRENT_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).