MySQL - МЕЖДУ не выберет правильные результаты - PullRequest
2 голосов
/ 30 августа 2011

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

punch_id    eid     time    unixtime    punch_type  day     date        doy
135          2      12:53   1314723193  0            4   08/28/2011     241  
134          2      12:53   1314723190  3            4   08/31/2011     241
133          2      12:53   1314723187  2            4   08/20/2011     241
132          2      12:52   1314723125  1            4   08/30/2011     241

Я пробовал эти два запроса.

SELECT * FROM `punches` WHERE `date` >= '08/20/11' AND `date` <= '08/31/11'

SELECT * FROM `punches` WHERE `date` BETWEEN '08/20/11' AND '08/31/11'

Ни один из них не выбирает строки, содержащие дату 31.08.11.Он выбирает 20.08.11, хотя.Я попытался использовать его по-другому, и когда я запускаю запрос:

SELECT * FROM `punches` WHERE `date` >= '08/10/11' AND `date` <= '08/20/11'

, я снова не получаю правильный результат: 20-й опускается еще раз.В чем проблема с тем, как я выполняю это?

Ответы [ 4 ]

3 голосов
/ 30 августа 2011

См. этот связанный вопрос.

Как уже упоминали другие, ваша основная проблема не в учете времени.Вот несколько вариантов:

  1. Используйте функцию для преобразования DateTime в Date.Я не рекомендую эту опцию, так как она, вероятно, сделает функцию неразмечаемой .

  2. Расширьте вашу BETWEEN, чтобы явно включить последний моментдень: (примечание: это последнее возможное значение, которое может хранить MS SQL, не знаю, имеет ли MySQL такое же значение)

    SELECT * FROM `punches` WHERE `date` 
    BETWEEN '08/20/11 00:00:00.000' AND '08/31/11 23:59:59.997'
    
  3. Используйте < дляверхнее значение

    SELECT * FROM `punches` WHERE `date` >= '08/20/11' AND `date` < '09/01/11'
    

Я действительно считаю, что последнее легче в большинстве ситуаций.

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

** Отказ от ответственности: я парень MS SQL, а не MySQL

1 голос
/ 30 августа 2011

Ваше date поле типа DATE или DATETIME?

Вероятно, это связано с временем суток. Если у вас есть DATETIME, сохраненный как

2011-08-31 13:00:00

тогда он не будет совпадать с

BETWEEN '08/20/11' AND '08/31/11'

Вы должны использовать

BETWEEN '08/20/11' AND '09/01/11'

Документы MySQL в диапазоне от говорят, что он соответствует "меньше или равно" макс.

1 голос
/ 30 августа 2011

Если вы не указываете время с датой, то подразумевается 00:00:00.Таким образом, реальный запрос, который выполняет база данных, больше похож на ...

SELECT * FROM `punches` WHERE `date` BETWEEN '08/20/11 00:00:00' AND '08/31/11 00:00:00'

Следовательно, удар 31.08.2011 в 12:53 не будет включенЯ думаю, что это должно работать, и это немного более элегантно, чем добавление дня к дате окончания ...

SELECT * FROM `punches` WHERE DATE(`date`) BETWEEN '2011-08-20' AND '2011-08-31'
1 голос
/ 30 августа 2011

Я не знаю mysql, но в других RDBMS даты предполагают временную часть 12 часов утра. Если вы хотите включить верхнюю дату, добавьте 1 к дню.

...