2013-01-16 8 views
0

La table MySQL avec laquelle je travaille a la date et l'heure en colonnes séparées. Les dates sont au format "y-m-d" et "hh:mm:ss" pour le temps. Comment exactement je recherche les lignes entre deux fois si elles sont dans des jours différents? (Par exemple, les lignes entre 2013-01-15 12:00:00 et 2013-01-17 17:00:00)MySQL - Retour des lignes entre deux dates/heures

Actuellement, j'utilise une mauvaise solution de contournement en supposant que la différence de temps sera au plus un jour, mais ce ne sera pas toujours le cas. Il y a probablement un moyen facile d'accomplir cela, mais je n'arrive pas à comprendre quoi. Merci!

+0

Ne pouvez-vous pas modifier le schéma pour combiner les colonnes dans une seule colonne de type DATETIME ou TIMESTAMP? – eggyal

+0

Nous vous suggérons fortement de modifier vos données à DATETIME. – Strawberry

+0

Est-ce vraiment plus rapide que ça? Changer les tables prendrait beaucoup de temps car de nombreuses machines écrivent dans la base de données avec cette structure, mais je pourrais demander un changement si cela peut réellement faire une différence. – user1784397

Répondre

1

La réponse de JW. Peut être accélérée en utilisant d'abord l'index pour affiner l'espace de recherche, puis en réduisant les résultats à l'ensemble correct.

select * from births 
where date between '2013-01-15' and '2013-01-17' -- use index 
and concat(date, ' ', time) between '2013-01-15 12:00:00' and '2013-01-17 17:00:00' 
; 

Pour plus de détails, voir .

+0

Génial grâce à vous deux! La table que j'utilise est en effet très grande et cette indexation l'a fait fonctionner raisonnablement. – user1784397

2

concaténer les champs à l'aide CONCAT

SELECT * 
FROM tableName 
WHERE CONCAT(dateCol, ' ', timeColumn) BETWEEN 
      '2013-01-15 12:00:00' AND '2013-01-17 17:00:00' 

, mais je vous recommande (si possible) de modifier la table en combinant les deux colonnes avec DateTime afin que vous datatype pouvez profiter des indices. La requête ci-dessus qui utilise CONCAT nécessite full table scan ce qui est très pauvre en performance pour les grandes bases de données.

Questions connexes