2014-02-06 1 views
0

Речь идет о расписании. Пользователь выбирает 1 datetime, и мне нужно сравнить его с DB, если у меня нет чего-то еще за это время и + -2 часа (округлено).MySQL сравнивает два времени с датой_дока

Оба момента времени сохраняются в формате SQL «DATETIME» (гггг. -dd-мм чч: мм: сс)

условия являются: пользователем DATETIME не может быть более или менее чем 1 час и 59 минут (7199 секунд), как DB-DATETIME

Я стараюсь следующее:

SELECT event FROM schedule 
WHERE '2014-08-02 12:00:00' > DATE_ADD(event, INTERVAL -7199 SECOND) OR 
WHERE '2014-08-02 12:00:00' < DATE_ADD(event, INTERVAL +7199 SECOND) 

, который фиксировал дату и время в этом примере для проверки .. настоящее время datetime находится в строке $ _COOKIE ["userdt «]. Довольно уверен, что я рядом, но не могу.

ответ

0

Правильный способ написать запрос является:

SELECT event 
FROM schedule 
WHERE '2014-08-02 12:00:00' > DATE_ADD(event, INTERVAL -7199 SECOND) AND 
     '2014-08-02 12:00:00' < DATE_ADD(event, INTERVAL +7199 SECOND) 

Это меняет or к and и удаляет второй where.

Однако, я думаю, что лучший способ написать запрос является:

SELECT event 
FROM schedule 
WHERE event > DATE_ADD('2014-08-02 12:00:00', INTERVAL -2 hour) and 
     event < DATE_ADD('2014-08-02 12:00:00', INTERVAL +2 hour); 

Есть несколько причин этих изменений. Во-первых, interval 2 hour гораздо легче понять, чем interval 7199 second. Он разъясняет, что делает запрос. > и < в основном реализуют ту же логику (ладно, есть одна секунда разницы на обоих концах, но я думаю, что это не важно).

Во-вторых, попробуйте привыкнуть к трансформациям на «константах», а не «столбцах» в предложении where, когда вы легко сможете. Это позволяет MySQL использовать индекс для event для запроса. Когда event сначала обрабатывается функцией, MySQL не будет (обычно) использовать индекс в столбце.

+0

Да, я заметил, что второй ГДЕ, как только я отправил этот вопрос, но спасибо за советы, это будет полезно. –

0

За исключением неправильного обращения к sql sentece, это пользовательский ввод, который вы должны сравнить, а не поле в таблице. Это должно возвращать любое поле событий между 2014-08-02 10:00:00 и 2014-08-02 14:00:00

SELECT event FROM schedule 
WHERE event > DATE_ADD('2014-08-02 12:00:00', INTERVAL -7199 SECOND) 
AND event < DATE_ADD('2014-08-02 12:00:00', INTERVAL +7199 SECOND) 

UPDATE

Я пропустил ИЛИ, который будет затем верните что-либо до 2014-08-02 14:00:00 и после 2014-08-02 10:00:00, так что на самом деле все вернет. (Спасибо Гордону, который отметил: P)

+0

спасибо, он работает .. –