Requête SQL sélection entre deux dates
Question
Je souhaite sélectionner des enregistrements entre deux dates - un startDate et endDate (ils sont au format date / heure en sql).J'ai la requête SQL suivante mais cela ne fonctionne pas, quelqu'un pourrait-il me dire ce que je fais mal?
"SELECT *
FROM house
WHERE startDate >= '2012/02/22 00:00:00' AND endDate <= '2012-02-25 00:00:00'"
La solution
Je suggérerais de convertir les dates en date / heure et de les comparer ainsi que de garder la date standard et cohérente.Quelque chose comme:
"SELECT *
FROM house
WHERE DATE(startDate) >= DATE('2012-02-22 00:00:00')
AND DATE(endDate) <= DATE('2012-02-25 00:00:00')"
REMARQUE: j'ai supposé que votre startDate et endDate étaient du même format que les chaînes que vous avez fournies.
Autres conseils
Voulez-vous que toutes les lignes dont startDate
soit '2012-02-22'
ou version ultérieure et endDate
soit '2012-02-22'
ou précédent?Ensuite, utilisez ceci:
SELECT *
FROM house
WHERE startDate >= '2012-02-22'
AND endDate < '2012-02-26' --- notice the `<`, not `<=`
--- and the `day+1`
Lorsque vous utilisez des dates avec des produits SQL, mieux vaut utiliser ce format dans les requêtes et les instructions: '20120222'
ou ceci (que je trouve plus facile à lire: '2012-02-22'
.
L'utilisation de barres obliques comme '2012/02/22'
ou tout autre ordre que Year-Month-Day
n'est pas recommandée.
Il n'est pas nécessaire d'inclure la partie horaire.'2012-02-22 00:00:00'
est le même que '2012-02-22'
.
L'utilisation de endDate <= '2012-02-25 00:00:00'
signifie que toute ligne avec la date du 25 février 2012 mais après minuit ('00:00:00'
) ne correspondra pas à la condition.Si vous voulez aussi ces lignes, utilisez plutôt endDate < '2012-02-26'
.
Vous pouvez utiliser DATE(endDate) <= DATE('2012-02-25 00:00:00')
ou DATE(endDate) <= '2012-02-25'
mais ces conditions sont "non sargables", donc vos requêtes ne pourront pas utiliser un index sur endDate
.
Il existe le STR_TO_DATE
fonction dans MySql qui prend le même masque de format que date_format .
start_date >= str_to_date('2012/02/22 00:00:00','%Y/%m/%d %h:%i:%s)