Разница в дате Datetime не работает должным образом

#mysql

#mysql — сервер #mysql

Вопрос:

У меня есть поле, date_confirmed которое является datetime .

Таким образом, примером содержимого было бы

2011-01-03 20:54:41

Предложение where, которое я создал для извлечения последних строк из этой таблицы на основе date_confirmed , выглядит следующим образом…

 WHERE DATEDIFF(g.date_confirmed, CURDATE()) <= 28
  

Я использую PHP с MySQL, и я хочу извлекать только строки, в date_confirmed которых дата меньше 28 дней.

Может ли кто-нибудь помочь мне / указать мне лучшее направление?

Спасибо.

Комментарии:

1. В чем проблема, с которой вы столкнулись? Ваше использование DATEDIFF() правильно. Если вы получаете отрицательный результат, измените аргументы на противоположные или преобразуйте его в ABS() для абсолютного значения

2. Какой пончик, не сказал, в чем проблема. Он отображает строки, которым более 28 дней.

3. Или попробуйте это — ГДЕ DATEDIFF(CURDATE(), g.date_confirmed)

Ответ №1:

Ну, вы не говорите, что не работает, но я думаю, что вы, возможно, имели в виду изменить параметры:

 WHERE DATEDIFF(CURDATE(), g.date_confirmed) <= 28
  

поскольку у вас это было, CURDATE() (я предполагаю) всегда было бы более свежим, чем g.date_confirmed и, следовательно DATEDIFF() , всегда возвращало бы отрицательное число — и, следовательно, всегда было <= 28

Ответ №2:

Я думаю, вы захотите сменить на:

 WHERE DATEDIFF(g.date_confirmed, CURDATE()) <= -28
  

Согласно документации здесь (http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_datediff ) если второй аргумент является более свежим, чем первый аргумент, результирующее число будет отрицательным. Поскольку я предполагаю, что текущая дата является более поздней, чем ваша сохраненная дата, я предполагаю, что именно это здесь и происходит.

Комментарии:

1. Это не сработало, но когда я изменил параметры, это сработало. Спасибо.

2. Я думаю, вы имеете в виду > = -28, что также сработало бы — но замена аргументов понятнее!

Ответ №3:

Мне всегда кажется более понятным писать это как

 WHERE g.date_confirmed >= DATE_SUB( CURDATE(), INTERVAL 28 DAY )
  

… особенно там, где в моей записи может быть несколько столбцов даты, я думаю, это проясняет, с каким полем даты я сравниваю.