Datetime égal ou supérieur à aujourd'hui dans MySQL

175

Quelle est la meilleure façon de faire ce qui suit:

SELECT * FROM users WHERE created >= today;

Remarque: créé est un champ datetime.

n00b
la source

Réponses:

329
SELECT * FROM users WHERE created >= CURDATE();

Mais je pense que tu veux dire created < today

Clodoaldo Neto
la source
11
CURDATE()retour seulement date pas heure
Shakti Singh
20
@ n00b comment avez-vous des utilisateurs qui seront créés dans le futur ..? intéressant =) J'utilisais ceci pour voir si un message était encore expiré.
Garet Claborn
75
SELECT * FROM myTable WHERE  DATE(myDate) = DATE(NOW())

En savoir plus: http://www.tomjepson.co.uk/tutorials/36/mysql-select-where-date-today.html

Edmhs
la source
6
Il me manque peut-être quelque chose, mais avec les types DATETIME, la solution CURDATE () ne fonctionne pas. Cela fait.
Jahmic
De plus, cela prend beaucoup de temps car il y a une surcharge de conversion de DATETIME en date via la fonction DATE (), puis de comparaison avec la condition where.
roopunk
N'utilisez pas de fonctions sur les colonnes, cela oblige la requête à ignorer l'index, ce qui entraîne des requêtes lentes. Vérifiez ma réponse pour une approche alternative stackoverflow.com/a/42365426/4311336
Bsienn
33
SELECT * FROM users WHERE created >= NOW();

si la colonne est de type datetime.

Shakti Singh
la source
1
je veux dire aujourd'hui pas maintenant: ai-je besoin aujourd'hui comme 03/03/2011 pas 03/03/2011 14:02:02
n00b
@ n00b: il retournera des lignes plus grandes qu'aujourd'hui, ne vous inquiétez pas si l'heure est incluse
Shakti Singh
3
disons que c'est le 02/02/2011 14:02:02 - les utilisateurs qui ont été créés à 10:02:02 ne seront pas renvoyés dans votre version même s'ils ont été créés "aujourd'hui" :)
n00b
@ n00b: Lol ya, aucun utilisateur ne serait jamais renvoyé, si seulement nous pouvions arrêter le temps.
Mike Purcell
15

Si 'created' est de type datetime

SELECT * FROM users WHERE created < DATE_ADD(CURDATE(), INTERVAL 1 DAY);

CURDATE () signifie également '2013-05-09 00:00:00'

bart
la source
Merci pour cela. J'avais en fait besoin de DATE_SUB (utilisé de la même manière), mais cela m'a mis sur la bonne voie.
Daniel Price
Cela ne renverra pas les données dont la date contient 0 dans le temps, c'est-à-dire que «2013-05-09 00:00:00» sera omis
Bsienn
8

La réponse marquée est trompeuse. La question posée est DateTime, mais a déclaré que ce qui était nécessaire était juste CURDATE().

La réponse la plus courte et la plus correcte à cette question est:

SELECT * FROM users WHERE created >= CURRENT_TIMESTAMP;
JeffMan
la source
5

Si la colonne a un index et qu'une fonction est appliquée sur la colonne, l'index ne fonctionne pas et une analyse complète de la table se produit, entraînant une requête très lente.

Pour utiliser l'index et comparer la date / heure avec la date actuelle / actuelle, les éléments suivants peuvent être utilisés.

Solution pour OP:

select * from users
where created > CONCAT(CURDATE(), ' 23:59:59')

Exemple pour obtenir des données pour aujourd'hui:

select * from users
where 
    created >= CONCAT(CURDATE(), ' 00:00:00') AND
    created <= CONCAT(CURDATE(), ' 23:59:59')

Ou utilisez BETWEEN pour faire court

select * from users 
where created BETWEEN 
      CONCAT(CURDATE(), ' 00:00:00') AND CONCAT(CURDATE(), ' 23:59:59')
Bsienn
la source
2
SELECT * FROM users WHERE created >= now()
Silx
la source
Cela ne rendra pas les enregistrements avant ce moment à partir d'aujourd'hui.
gsziszi
0

Le code ci-dessous a fonctionné pour moi.

declare @Today date

Set @Today=getdate() --date will equal today    

Select *

FROM table_name
WHERE created <= @Today
Rob Fahndrich
la source
-1
SELECT * FROM table_name WHERE CONCAT( SUBSTRING(json_date, 11, 4 ) ,  '-', SUBSTRING( json_date, 7, 2 ) ,  '-', SUBSTRING(json_date, 3, 2 ) ) >= NOW();

json_date ["05/11/2011"]

vpgodara
la source
C'est une solution très brute
IgniteCoders
-5

vous pouvez renvoyer toutes les lignes et utiliser la fonction php dateiff dans une instruction if, bien que cela alourdit le serveur.

if(dateDiff(date("Y/m/d"), $row['date']) <=0 ){    
}else{    
echo " info here";    
}
Koney L Visinko
la source
4
c'est très lent par rapport à la sélection de base de données
IgniteCoders