MySQL FROM_UNIXTIME (временная метка) не работает должным образом

#php #mysql #timestamp #unix-timestamp

#php #mysql #временная метка #unix-временная метка

Вопрос:

Я пытаюсь узнать, сколько партнеров было добавлено по месяцам за последние 12 месяцев, и у меня есть этот запрос:

 SELECT COUNT(n.nid) AS expression FROM node n 
WHERE (FROM_UNIXTIME(created) >= '2014-07-01') 
AND (FROM_UNIXTIME(created) <= '2014-07-31') 
AND (n.type = 'partner') 
AND (n.status = 1)    
  

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

Кто-нибудь имеет представление о том, что может быть причиной этого?

Заранее спасибо!

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

1. В каком формате хранится ваше created поле? Я бы не использовал FROM_UNIXTIME для сравнения дат.

2. Вам не нужно FROM_UNIXTIME в WHERE предложении. Попробуйте удалить его.

3. Вашей информации в этом вопросе недостаточно для полной диагностики проблемы. Вы должны лучше предоставить нам инструкцию определения таблицы с типом данных created поля, как просил Сэм. Далее нам нужны INSERT инструкции для обоих особых дней. У меня есть объяснение для последнего дня месяца, это достаточно просто: представьте, что FROM_UNIXTIME дает вам 2014-07-31 19:58:30 значение, не меньшее или равное 2014-07-31 . Первый день месяца может быть вызван несоответствием часового пояса времени UTC.

4. Извините, ребята. Созданное поле является временной меткой.

5. Тогда я не понимаю, что ваш запрос работает со вставками в другие дни. SELECT FROM_UNIXTIME(NOW()) as mytest; выдает NULL в качестве результата, потому что временная метка MySQL не является временной меткой UNIX. Вы можете использовать напрямую WHERE (created >= '2014-07-01') AND ... , как сказал superphonic. Чтобы обойти проблему, о которой я упоминал в своем последнем комментарии, вы могли бы использовать (created < '2014-08-01') вместо этого. Если вы используете столбец вместо вычисляемого значения, MySQL может использовать индекс, если он есть.

Ответ №1:

Существует функция UNIX_TIMESTAMP, которая преобразует форматированное значение 0000-00-00 00:00:00 в целое число временной метки Linux.

Вы можете использовать это: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_unix-timestamp

Я прав, вы хотите сравнить даты. Если нет, пожалуйста, проигнорируйте этот ответ