MySQL между датами, получая результат - PullRequest
0 голосов
/ 06 октября 2011

У меня есть следующие строки в mytable

date_start
-----------
2011-09-20 13:00:00
2011-10-01 13:14:00
2011-10-09 13:16:00
2011-09-27 15:00:00
2011-09-30 14:04:00
2011-10-03 14:00:00


У меня есть этот запрос:

SELECT date_start
FROM `mytable`
WHERE date_start >= "2011-09-19"
AND date_start <= "2011-09-30"
LIMIT 0 , 30

Проблема в том, что он выводит только:

2011-09-20 13:00:00
2011-09-27 15:00:00

Я ожидаю этого результата:

    2011-09-20 13:00:00
    2011-09-27 15:00:00
    2011-09-30 14:04:00

Потому что, если мы посмотрим на запрос, он должен включить это как результат: 2011-09-30 14:04:00
Что я здесь не так делаю?

Я также использовал BETWEEN в mysql, но результат остается тем же.

Любая помощь будет принята с благодарностью и вознаграждена.

Спасибо!

Ответы [ 6 ]

2 голосов
/ 06 октября 2011

Предполагается, что дата, считающаяся датой-временем, имеет часть 00:00:00: часы: минуты: секунды. Таким образом, 2011-09-30 14:04:00 на самом деле> = 2011-09-30.

Чтобы сделать то, что вы хотите, попробуйте:

SELECT date_start
FROM `mytable`
WHERE date(date_start) >= "2011-09-19"
AND date(date_start) <= "2011-09-30"
LIMIT 0 , 30
2 голосов
/ 06 октября 2011

Время также считается. Вы должны упомянуть это как

SELECT date_start
FROM `mytable`
WHERE date_start >= "2011-09-19"
AND date_start <= "2011-09-30 23:59:59"
LIMIT 0 , 30
1 голос
/ 06 октября 2011

date_start <= '2011-09-30' означает, что дата 2011-09-30 00:00:00 включена, а 2011-09-30 00:00:01 и более поздние - нет. Вы можете использовать оператор < плюс арифметика даты здравого смысла для обходного пути:

SELECT date_start
FROM   mytable
WHERE  date_start >= '2011-09-19'
AND    date_start <  '2011-09-30' + INTERVAL 1 DAY
LIMIT  0, 30
1 голос
/ 06 октября 2011

Лично я бы разделил элементы даты и времени на два отдельных поля, date_start и time_start, которые затем позволили бы вашему запросу корректно работать в кодированном виде, а также позволили бы выполнять более сложные и интересные операции с датами.действия, такие как объяснены в моем ответе на следующий вопрос.

Выберите все месяцы в пределах данного диапазона дат, включая месяцы со значениями 0

Если вы можете 'Это не сильно изменит то, как работает система, добавив один день к дате, по которой вы хотите отфильтровать, и затем сделайте < вместо <= сравнения.

WHERE date_start >= "2011-09-19"
    AND date_start < "2011-10-01"

Это будет работать быстрее, чем выполнение DATE (date_start) в вашем фильтре, поскольку MySQL не сможет использовать какие-либо индексы, поскольку вы выполняете функцию над полями, которые могут быть проиндексированы.

Надеюсь, что это поможет.

1 голос
/ 06 октября 2011

2011-09-30 будет интерпретироваться как 2011-09-30 00:00:00.Попробуйте установить конец диапазона как 2011-09-30 23:59:59, и все будет хорошо.

0 голосов
/ 06 октября 2011

если вы используете между оператором в запросе, тогда он извлечет все записи, которые находятся между начальной и конечной точками.

Например:

SELECT date_start
FROM `mytable`
WHERE date_start between '2011-09-19'and '2011-09-30:23:59:59'
LIMIT 0 , 30

Просто попробуйте это согласно вашему требованию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...