Выбор SQL-запроса между двумя датами - PullRequest
2 голосов
/ 22 февраля 2012

Я хочу выбрать записи между двумя датами - startDate и endDate (они имеют формат даты / времени в sql). У меня есть следующий запрос sql, но он не работает, может кто-нибудь сказать мне, что я делаю неправильно?

"SELECT * 
FROM house 
WHERE startDate >= '2012/02/22 00:00:00' AND endDate <= '2012-02-25 00:00:00'"

Ответы [ 3 ]

3 голосов
/ 22 февраля 2012

Я бы предложил преобразовать даты в дату-время и сравнить их, а также сохранить дату стандартной и последовательной. Что-то вроде:

"SELECT * 
FROM house 
WHERE DATE(startDate) >= DATE('2012-02-22 00:00:00') 
  AND DATE(endDate) <= DATE('2012-02-25 00:00:00')"

ПРИМЕЧАНИЕ. Я предположил, что ваши startDate и endDate имеют тот же формат, что и предоставленные вами строки.

2 голосов
/ 22 февраля 2012

Хотите ли вы, чтобы все строки, которые startDate были '2012-02-22' или более поздними, а endDate - '2012-02-22' или предыдущими? Затем используйте это:

SELECT * 
FROM house 
WHERE startDate >= '2012-02-22' 
  AND endDate < '2012-02-26'           --- notice the `<`, not `<=`
                                       --- and the `day+1`

При использовании дат с продуктами SQL лучше использовать этот формат в запросах и выражениях: '20120222' или этот (который мне легче читать: '2012-02-22'.

Использование слешей, таких как '2012/02/22' или любой другой порядок, кроме Year-Month-Day, не рекомендуется.

Нет необходимости включать временную часть. '2012-02-22 00:00:00' совпадает с '2012-02-22'.

Использование endDate <= '2012-02-25 00:00:00' означает, что любая строка с датой 25 февраля 2012 года, но после полуночи ('00:00:00') не будет соответствовать условию. Если вам нужны эти строки, используйте вместо этого endDate < '2012-02-26'.

Вы можете использовать DATE(endDate) <= DATE('2012-02-25 00:00:00') или DATE(endDate) <= '2012-02-25', но эти условия не могут быть использованы, поэтому ваши запросы не смогут использовать индекс для endDate.

0 голосов
/ 22 февраля 2012

В MySql есть встроенная функция STR_TO_DATE, которая принимает ту же маску формата, что и date_format .

start_date >= str_to_date('2012/02/22 00:00:00','%Y/%m/%d %h:%i:%s)
...