Как вычесть часы из datetime в MySQL?

#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).

Ответ №3:

Обычный запрос выбора. введите описание изображения здесь

После применения функции DATE_ADD() в MySQL

 select lastname, 
    date_add(changedat, interval -24 hour) as newdate
from employee_audit;
  

lastname и changedat — это имя поля, а employee_audit — это имя таблицы.
введите описание изображения здесь