web-dev-qa-db-fra.com

Horodatage MySQL sélectionner une plage de dates

Je ne sais pas vraiment par où commencer avec celui-ci. Quelqu'un peut-il m'aider/m'indiquer dans la bonne direction?.

J'ai une colonne d'horodatage dans MySQL et je souhaite sélectionner une plage de dates, par exemple, tous les horodatages datant d'octobre 2010.

Merci.

33
DRKM

Habituellement ce serait ceci:

SELECT * 
  FROM yourtable
 WHERE yourtimetimefield>='2010-10-01'
   AND yourtimetimefield< '2010-11-01'

Mais comme vous avez un timestamp unix, vous aurez besoin de quelque chose comme ça:

SELECT * 
  FROM yourtable
 WHERE yourtimetimefield>=unix_timestamp('2010-10-01')
   AND yourtimetimefield< unix_timestamp('2010-11-01')
43

Une méthode compacte et flexible pour les horodatages sans fraction de seconde serait:

SELECT * FROM table_name 
WHERE field_name 
BETWEEN UNIX_TIMESTAMP('2010-10-01') AND UNIX_TIMESTAMP('2010-10-31 23:59:59')

Si vous utilisez des fractions de secondes et une version récente de MySQL, mieux vaut utiliser les opérateurs >= et < conformément à la réponse de Wouter

Voici un exemple de champs temporels définis avec une précision seconde seconde (précision maximale utilisée):

mysql> create table time_info (t_time time(6), t_datetime datetime(6), t_timestamp timestamp(6), t_short timestamp null);
Query OK, 0 rows affected (0.02 sec)

mysql> insert into time_info set t_time = curtime(6), t_datetime = now(6), t_short = t_datetime;
Query OK, 1 row affected (0.01 sec)

mysql> select * from time_info;
+-----------------+----------------------------+----------------------------+---------------------+
| 22:05:34.378453 | 2016-01-11 22:05:34.378453 | 2016-01-11 22:05:34.378453 | 2016-01-11 22:05:34 |
+-----------------+----------------------------+----------------------------+---------------------+
1 row in set (0.00 sec)
37
Cez
SELECT * FROM table WHERE col >= '2010-10-01' AND col <= '2010-10-31'
5
Dan Grossman

Je peux voir des gens faire beaucoup de commentaires sur cette question. Mais je pense que la simple utilisation de LIKE pourrait être plus facile d’obtenir les données de la table. 

SELECT * FROM table WHERE COLUMN LIKE '2013-05-11%'

Utilisez LIKE et publiez une recherche de caractères génériques. Espérons que cela résoudra votre problème.

4
abhijitcaps

Cette requête SQL va extraire les données pour vous. C'est facile et rapide.

SELECT *
  FROM table_name
  WHERE extract( YEAR_MONTH from timestamp)="201010";
3
Juanma Font

Dans la mesure du possible, évitez d'appliquer des fonctions à une colonne de la clause where:

SELECT *
  FROM table_name
 WHERE timestamp >= UNIX_TIMESTAMP('2010-10-01 00:00:00') 
   AND timestamp <  UNIX_TIMESTAMP('2010-11-01 00:00:00');

L'application d'une fonction à la colonne timestamp (par exemple, FROM_UNIXTIME (timestamp) = ...) rend l'indexation beaucoup plus difficile.

3
Markus Winand

Si vous avez un timestamp mysql, quelque chose comme 2013-09-29 22:27:10 vous pouvez le faire 

 select * from table WHERE MONTH(FROM_UNIXTIME(UNIX_TIMESTAMP(time)))=9;

Convertissez-vous en unix, puis utilisez les fonctions de temps unix pour extraire le mois, dans ce cas 9 pour septembre.

0
Federico