Показать строки из MySQL, где дата и время в течение следующего часа - PullRequest
6 голосов
/ 15 апреля 2010

У меня всегда проблемы со сложными SQL-запросами.

Это то, что у меня есть

$query = '
            SELECT id,
                   name, 
                   info, 
                   date_time
            FROM acms_events
                WHERE date_time = DATE_SUB(NOW(), INTERVAL 1 HOUR)
                    AND active = 1
            ORDER BY date_time ASC
            LIMIT 6
        ';

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

Какой правильный синтаксис для этого?

Ответы [ 2 ]

10 голосов
/ 15 апреля 2010

Я собираюсь постулировать, что вы просматриваете группу записей, которые содержат диапазон значений DATETIME, так что вы, вероятно, захотите что-то более похожее на это:

SELECT id,
       name, 
       info, 
       date_time
FROM acms_events
    WHERE date_time < DATE_ADD(NOW(), INTERVAL 1 HOUR)
        AND date_time >= NOW()
        AND active = 1
ORDER BY date_time ASC
LIMIT 6

В противном случае ваш запрос ищет записи с датой и временем точно"сейчас + 1 час". Я предполагаю, что все ваши даты не относятся именно к этой конкретной секунде. ;)

Чтобы пояснить немного, DATE_ADD() и DATE_SUB() возвращают точные временные метки, так что ваш запрос выше примерно переводится в нечто вроде SELECT ... WHERE date_time = '2010-04-14 23:10:05' ORDER BY ..., что я не думаю, что вы хотите.

0 голосов
/ 15 апреля 2010
WHERE date_time = DATE_SUB(NOW(), INTERVAL 1 HOUR)

означает, что date_time теперь точно равен минус один час, что приведет к тому, что любая запись будет иметь ровно час.

Почему бы не использовать

WHERE TIMEDIFF(date_time, NOW()) < '01:00:00'
AND date_time > NOW()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...