Comment soustraire 30 jours de la date / heure actuelle dans mysql?

205

Comment soustraire 30 jours de la date / heure actuelle dans mysql?

SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();
user784637
la source

Réponses:

133

Pour toute personne qui ne souhaite pas utiliser DATE_SUB, utilisez CURRENT_DATE:

SELECT CURRENT_DATE - INTERVAL 30 DAY
Doug Fir
la source
2
Je donnerais +10 si je pouvais. SQL doit être axé sur la lisibilité et c'est le moyen le plus lisible de le faire.
Colin 't Hart
9
Résultat plus lisible mais différent de l'utilisation 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.
ypercubeᵀᴹ
2
@ ypercubeᵀᴹ puis utilisez à la current_timestampplace decurrent_date
isapir
20

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 BETWEENsi 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.

Joseph Lust
la source
3
Vous avez donc proposé de ne pas l'utiliser 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
zerkms
@zerkms Comment cette requête produirait-elle un jeu de résultats différent de votre requête?
user784637
2
@ user784637: euh, BETWEENet il >=y a différents opérateurs, vous savez? Ma requête limite le jeu de résultats pour 30 days ago AND todayceci everything after 30 days ago. Les tomorrowenregistrements ne correspondent donc pas à la mienne et à votre requête d'origine, mais correspondront à cette réponse
zerkms
Ok, mon mauvais. En règle générale, ces requêtes se trouvent dans des tables dynamiques qui se développent avec le temps. C'est pourquoi j'ai laissé tomber l'intervalle. J'ai clarifié ma réponse ci-dessus.
Joseph Lust
@JosephLust, Pour résoudre les problèmes de performances, utilisez plutôt ma solution .
Pacerier
19

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 
Eric Leschinski
la source
18

Vous pouvez aussi utiliser

select CURDATE()-INTERVAL 30 DAY
Noby Nirmal
la source
1
SELECT date_format(current_date - INTERVAL 50 DAY,'%d-%b-%Y')

Vous pouvez formater en utilisant le format de date dans SQL.

Varaj Vignesh
la source
0

autrement

SELECT COUNT(*) FROM tbl_debug WHERE TO_DAYS(`when`) < TO_DAYS(NOW())-30 ;
zzapper
la source
0

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. intervalest destiné aux cas où vous avez besoin d'un composant non journalier.

Pacerier
la source
11
Alors, vous prétendez que subdate(curdate(), 30)c'est plus rapide que CURRENT_DATE - INTERVAL 30 DAY? Avez-vous une preuve? Et à quelle vitesse serait-ce? Quelques microsecondes?
ypercubeᵀᴹ
2
Je n'ai aucune idée. Je ne peux certainement pas voter pour mes propres commentaires. Concernant la réclamation «potentiellement» plus rapide, je ne vois toujours aucune preuve, décisive ou circonstancielle. Et même si c'est un peu plus rapide, la condition serait évaluée une fois. Sauf si vous exécutez la requête des millions de fois par minute, la différence n'aura pas d'importance.
ypercubeᵀᴹ
2
Je suppose que subdatele 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é"?
Andriy M
1
En outre, en ce qui concerne le libellé de la question, 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).
Andriy M
1
@AndriyM, Eh bien, puisque ce fil reçoit 50k vues, je vais laisser la réponse ici pour les personnes qui ne s'intéressent que par la composante temporelle. Et en ce qui concerne "l'arité", cela fait référence à un certain nombre d'arguments . Oui, c'est correct, toutes choses étant égales par ailleurs, une fonction 2-arité est potentiellement plus rapide qu'une fonction 3-arité. Cela restera vrai jusqu'à ce que de nouvelles informations soient ajoutées à l'assiette.
Pacerier