J'ai enregistré les dates d'enregistrement d'un utilisateur comme date/heure, ce qui est par exemple 2011-12-06 10:45:36 . J'ai exécuté cette requête et j'attendais cet article - 2011-12-06 10:45:36 - sera sélectionné:
SELECT `users`.* FROM `users` WHERE created_at >= '2011-12-01' AND
created_at <= '2011-12-06'
Mais n'est pas. Existe de manière élégante, comment sélectionner cet article? La première idée que j'ai eu était comme 2011-12-06 + 1
, mais cela n'a pas l'air très gentil.
Votre problème est que la version abrégée des dates utilise minuit par défaut. Donc, votre requête est en réalité:
SELECT users.* FROM users
WHERE created_at >= '2011-12-01 00:00:00'
AND created_at <= '2011-12-06 00:00:00'
C'est pourquoi vous ne voyez pas le record de 10h45.
Changez le en:
SELECT users.* FROM users
WHERE created_at >= '2011-12-01'
AND created_at <= '2011-12-07'
Vous pouvez aussi utiliser:
SELECT users.* from users
WHERE created_at >= '2011-12-01'
AND created_at <= date_add('2011-12-01', INTERVAL 7 DAY)
Ce qui sélectionnera tous les utilisateurs dans le même intervalle que vous recherchez.
Vous pouvez également trouver l'opérateur BETWEEN plus lisible:
SELECT users.* from users
WHERE created_at BETWEEN('2011-12-01', date_add('2011-12-01', INTERVAL 7 DAY));
Vous devez utiliser '2011-12-07' comme point de fin en tant que date sans heure définie par défaut à 00:00:00.
Donc, ce que vous avez réellement écrit est interprété comme:
SELECT users.*
FROM users
WHERE created_at >= '2011-12-01 00:00:00'
AND created_at <= '2011-12-06 00:00:00'
Et votre heure est: 2011-12-06 10:45:36 qui n’est pas entre ces points.
Change ceci aussi:
SELECT users.*
FROM users
WHERE created_at >= '2011-12-01' -- Implied 00:00:00
AND created_at < '2011-12-07' -- Implied 00:00:00 and smaller than
-- thus any time on 06
SELECT users.* FROM users WHERE created_at BETWEEN '2011-12-01' AND '2011-12-07';
Avez-vous essayé avant et après plutôt que> = et <=? Aussi, est-ce une date ou un horodatage?
La recherche de created_at <= '2011-12-06'
recherchera tout enregistrement créé à minuit ou avant le 2011-12-06 . Vous souhaitez rechercher created_at < '2011-12-07'
.
Une autre alternative consiste à utiliser la fonction DATE()
sur l'opérande gauche, comme indiqué ci-dessous.
SELECT users.* FROM users WHERE DATE(created_at) BETWEEN '2011-12-01' AND '2011-12-06'
Peut-être utiliser entre mieux. Cela a fonctionné pour moi pour obtenir la gamme puis la filtrer