#mysql #datetime #gmt
#mysql #datetime #gmt
Вопрос:
Я получаю поле datetime, которое в данный момент находится в запросе как:
SELECT DATE_FORMAT(x.date_entered, '%Y-%m-%d') AS date FROM x ORDER BY date ASC
Что я хочу сделать, так это вычесть 3 часа из этой даты (проблемы с GMT), но я не могу сделать это в PHP, поскольку PHP знает только часть даты, а не время.
Ответ №1:
MySQL имеет DATE_SUB()
:
SELECT DATE_SUB(column, INTERVAL 3 HOUR)....
но не лучше ли вместо этого попытаться разобраться с основной проблемой часового пояса?
Комментарии:
1. Ну, GMT — это не совсем то, что я могу изменить (чертово наследие), но как получить это в нужном мне формате?
%Y-%m-%d
2. @Lucas Я не уверен, почему вы делаете
DATE_FORMAT()
в первую очередь —DATE(x.date_entered)
не сделали бы уже? Последняя строка будетDATE(DATE_SUB(x.date_entered, INTERVAL 3 HOUR))
3. Я хотел предварительно отформатировать дату в желаемом формате (ГГГГ / ММ / ДД), но я не был уверен, как это сделать в PHP, поэтому я использовал SQL.
4. @Lucas ах, достаточно справедливо. Затем оберните DATE_FORMAT вокруг
DATE_SUB
директивы, и это должно сработать.5. Но как мы можем вычесть часы, чтобы мы могли получить (дату и отметку времени каждого дня, например, 23:00:00)
Ответ №2:
Предполагая, что у вас есть какая-то проблема с часовым поясом и вы знаете часовой пояс источника и назначения, вы могли бы преобразовать его следующим образом
SELECT DATE_FORMAT(CONVERT_TZ(x.date_entered, 'UTC', 'Europe/Berlin'),
'%Y-%m-%d') AS date
FROM x ORDER BY date ASC;
Комментарии:
1. Это, вероятно, «правильное» решение во многих случаях, но, к сожалению, для этого требуется, чтобы таблица часовых поясов была установлена с mysql. В противном случае вы просто получите NULL. Я проголосовал «за», основываясь на тех конкретных проблемах с часовым поясом, где это было бы наиболее правильным решением. Например, у вас могут быть две области в разных часовых поясах, и только одна из них использует переход на летнее время, поэтому иногда разница будет составлять 3 часа, а иногда 2 часа (или 4).