#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:
-
Вам действительно нужно, чтобы часовой пояс вашего компьютера отличался от UTC? почему бы просто не установить значение UTC и не запутаться? Если это не сработает, просто используйте dateadd () в mysql, чтобы преобразовать вашу временную метку mysql в UTC при проверке?
-
Моим предложением было бы написать небольшую функцию для преобразования метки времени mysql в ваш формат метки времени PHP и загрузить ее в mysql. Затем все, что вам нужно сделать, это вызвать tmstamp (time_stamp) вместо time_stamp в вашем запросе. Вы также можете сделать обратное, т. Е. преобразовать временную метку PHP «30 минут назад» в формат mysql и повторно запустить ваш запрос (возможно, проще).
Обычно это просто проблема с форматированием. Это не стандартизировано в разных программах.
Комментарии:
1. Ну, требование состоит в том, чтобы хранить время в MySQL в UTC .. и я очень плох с часовыми поясами.. Но, видите ли, у меня нет доступа к приложению, которое хранит данные в mysql, поэтому mysql должен добавить свою собственную временную метку.