2014-01-30 4 views
1

У меня есть таблица MySQL с полем end_date типа DATETIME, в котором хранится дата UTC. Я хочу получить разницу в минутах между NOW() и значением end_date. Я alredy нашел много вопросов и ответов здесь, в stackoverflow, чтобы сделать это, некоторые используют UNIX_TIMESTAMP, который из того, что я понимаю, принимает входное значение и преобразует его в UTC (поэтому я не могу использовать его, потому что моя дата alredy UTC) и другие который предлагает использовать TIME_TO_SEC и делить на 60. Это то, что я взял:Получите разницу дат в минутах с MySQL

INTERVAL (TIME_TO_SEC(UTC_TIMESTAMP()) - TIME_TO_SEC(end_date))/60 MINUTE 

Он отлично работает, пока текущий день не отличается от дня end_date «s. В этот момент результат вычитания отрицательный, и когда я использую этот код внутри функции DATE_ADD, он выводит неверный результат. Как я могу это исправить?

ответ

2

Попробуйте использовать

INTERVAL (TO_SECONDS(UTC_TIMESTAMP()) - TO_SECONDS(end_date))/60 MINUTE 
+1

Я не могу найти TO_SECONDS в документах MySQL. Кстати, я не могу использовать СЕЙЧАС, потому что, как я сказал в моем вопросе, сохраненная дата находится в UTC, а NOW возвращает текущую дату в часовой пояс сервера – Stefano

+0

здесь. Http://dev.mysql.com/doc/refman /5.5/en/date-and-time-functions.html#function_to-seconds, я редактирую свой ответ, чтобы установить UTC_TIMESTAMP() – miltos

2

Попробуйте ABS

INTERVAL (ABS(TIME_TO_SEC(UTC_TIMESTAMP()) - TIME_TO_SEC(end_date)))/60 MINUTE 

Или, если вы всегда хотите разницу положительный, то на end_date проверки, если она позднее now или utc_timestamp. Если позднее его замените на now, и разница будет 0.

0

Вы можете использовать TIMESTAMPDIFF() функции в MySQL:

SELECT TIMESTAMPDIFF(MINUTE, CURRENT_TIME, end_date) 
FROM my_table 

Однако, обратите внимание, что для этого приложения вы должны действительно использовать тип TIMESTAMP данных MySQL (который автоматически преобразует между сеансом time_zone и UTC для хранения) вместо DATETIME (который не выполняет преобразование часового пояса, но просто сохраняет значение, как если бы вы сделали фотографию календаря & часов). Следовательно, если ваш time_zone вашего сеанса - это что-то другое, кроме UTC, с вашим текущим полем DATETIME вы будете страдать от ошибок, возникающих из-за отсутствия преобразования часового пояса —, нужно было бы явно настроить такие различия, например. используя CONVERT_TZ().

Для получения дополнительной информации см. MySQL Server Time Zone Support.

+0

Я сохраняю значение как дату-время, потому что я всегда конвертирую в и из UTC внутри своего PHP приложение, поэтому нет необходимости делать преобразования в базе данных, так как я всегда уверен, что значения хранятся в UTC – Stefano

+0

@Stefano: достаточно хорошо, но не забудьте установить «time_zone» сеанса в UTC перед выполнением этой операции (или иначе значение, используемое для 'CURRENT_TIME', будет в другом часовом поясе, и MySQL не будет конвертировать' end_date' для совместимости). – eggyal

+0

Вот почему я использовал UTC_TIMESTAMP вместо СЕЙЧАС, например: D – Stefano

Смежные вопросы