web-dev-qa-db-fra.com

MySQL - sélection des données de la base de données entre deux dates

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.

12
user984621

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));
31
dash

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
4
Martin York
SELECT users.* FROM users WHERE created_at BETWEEN '2011-12-01' AND '2011-12-07';
4
maprihoda

Avez-vous essayé avant et après plutôt que> = et <=? Aussi, est-ce une date ou un horodatage?

1
vextorspace

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

1
Brian Hoover

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'

1
user7618441

Peut-être utiliser entre mieux. Cela a fonctionné pour moi pour obtenir la gamme puis la filtrer 

0
sys_debug