Извлечение данных из mysql путем преобразования его временной метки во время unix

#php #mysql

#php #mysql

Вопрос:

Это будет сделано с помощью PHP.

Я в основном хочу получить количество строк, которые были вставлены 30 минут назад.

У меня в таблице есть поле time, которое имеет тип TIMESTAMP, и при обновлении ему присваивается значение CURRENT_TIMESTAMP.

Дата сохраняется в этом формате:

 2011-05-27 04:29:17
  

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

 SELECT COUNT(*) FROM mytable WHERE UNIX_TIMESTAMP(time) < '.time().'-1800
  

Где time() — это функция PHP, которая извлекает время UNIX.

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

Кто-нибудь может помочь?

Небольшое редактирование: Другая проблема, которую я вижу, заключается в том, что функция php time () отображает время unix, которое равно UTC. Время, хранящееся в mysql, вероятно, равно GMT, т.Е. независимо от того, на какое время / часовой пояс установлен на моем компьютере.

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

1. У меня та же проблема, о которой упоминает дикидера в своей «Небольшой правке». Что я ищу, так это то, где php получает свое time () по сравнению с тем, где MySQL получает CURRENT_TIMESTAMP ПРИ ОБНОВЛЕНИИ. Мне действительно наплевать, использую я UTC или нет, мне просто нужно, чтобы они совпадали.

Ответ №1:

Вы можете легко получить строки, сохраненные с настоящего момента до 30 mins давности, просто используя:

 SELECT count(*) FROM mytable WHERE `time` >= DATE_SUB(UTC_TIMESTAMP, INTERVAL 30 minute)
  

Использование UTC_TIMESTAMP — это просто пример, если вы храните свои данные о дате / времени как UTC_TIMESTAMP() , вы, вероятно, можете использовать NOW() при необходимости, зависит от того, что вы храните на самом деле.

** РЕДАКТИРОВАТЬ ** Удалены неверные указатели и исправлен пример 🙂

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

1. @tradyblix: Нет необходимости изменять COUNT(*) .

2. Как ни странно, когда я запускаю этот запрос напрямую через phpMyAdmin, я получаю все строки в таблице, которые, кстати, были вставлены день назад, а не 30 минут назад

3. @tradyblix: То, о COUNT() чем вы говорите, в MySQL явно неправильно. MySQL на самом деле работает COUNT(*) быстрее, чем COUNT(field) . Просто попробуйте это с таблицей с несколькими миллионами строк.

4. @ypercube моя ошибка, исправлена для всеобщего блага 🙂

5. @dikidera: Попробуйте, используя NOW() вместо UTC_TIMESTAMP

Ответ №2:

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

  2. Моим предложением было бы написать небольшую функцию для преобразования метки времени mysql в ваш формат метки времени PHP и загрузить ее в mysql. Затем все, что вам нужно сделать, это вызвать tmstamp (time_stamp) вместо time_stamp в вашем запросе. Вы также можете сделать обратное, т. Е. преобразовать временную метку PHP «30 минут назад» в формат mysql и повторно запустить ваш запрос (возможно, проще).

Обычно это просто проблема с форматированием. Это не стандартизировано в разных программах.

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

1. Ну, требование состоит в том, чтобы хранить время в MySQL в UTC .. и я очень плох с часовыми поясами.. Но, видите ли, у меня нет доступа к приложению, которое хранит данные в mysql, поэтому mysql должен добавить свою собственную временную метку.