如何在MySQL中从日期时间减去小时数?

87

我有一个日期时间字段,目前在查询中的表示形式是:

SELECT DATE_FORMAT(x.date_entered, '%Y-%m-%d') AS date FROM x ORDER BY date ASC

我想要做的是从那个日期中减去3个小时(由于GMT问题),但我无法在PHP中完成,因为PHP只知道日期部分,不知道时间部分。

3个回答

164

mySQL有一个DATE_SUB()函数:

SELECT DATE_SUB(column, INTERVAL 3 HOUR)....

但是,尝试解决潜在的时区问题不是更好吗?


好吧,GMT 不是我能更改的东西(该死的遗留问题),但如何以我需要的格式获取它呢?%Y-%m-%d - Lucas Famelli
@Lucas,我不确定你为什么要首先使用DATE_FORMAT() - DATE(x.date_entered)不已经可以了吗?最后一行应该是DATE(DATE_SUB(x.date_entered, INTERVAL 3 HOUR)) - Pekka
我想以我想要的格式(YYYY/MM/DD)预先格式化日期,但我不确定如何在PHP中实现,所以我使用SQL完成了它。 - Lucas Famelli
@Lucas 哦,好的。那么将 DATE_FORMAT 包裹在 DATE_SUB 指令周围,它应该可以工作了。 - Pekka
但是我们如何减去小时,以便我们可以得到(昨天的日期和时间戳,例如23:00:00)? - shzyincu
@shzyincu 不确定你的意思?你可能想了解一下DATE_FORMAT()函数。http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html - Pekka

8
假设你存在时区问题并且知道源时区和目标时区,那么可以按照以下方式进行转换。
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个小时)。 - UncaAlby

1

普通的选择查询。 在此输入图片描述

一旦在MySQL中应用了DATE_ADD()函数

select lastname, 
    date_add(changedat, interval -24 hour) as newdate
from employee_audit;
lastnamechangedat是字段名,employee_audit是表名。 在此输入图片描述

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接