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


69

我得到一个datetime字段,当前在查询中为:

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

我想做的是从该日期减去3个小时(格林尼治标准时间问题),但是我无法在PHP中执行此操作,因为PHP仅知道日期部分,而不是时间。

Answers:


123

MySQL具有DATE_SUB()

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

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


好吧,GMT并不是我可以更改的东西(该死的遗产),但是如何以我需要的格式获得它呢?%Y-%m-%d
卢卡斯·法梅利

@Lucas我不确定您为什么首先要进行DATE_FORMAT()-DATE(x.date_entered)不会吗?最后一行是DATE(DATE_SUB(x.date_entered, INTERVAL 3 HOUR))
Pekka

我想以所需的格式(YYYY / MM / DD)对日期进行预格式化,但是我不确定如何在PHP中进行格式化,因此我确实使用了SQL。
卢卡斯·法梅利

@卢卡斯啊,很公平。然后将DATE_FORMAT包装在DATE_SUB指令周围,它应该可以工作。
Pekka

但是,我们如何减去小时数,这样我们才能得到(像23:00:00这样的日期和时间戳)
shzyincu 2016年

5

假设您遇到一些时区问题,并且知道源和目标时区,则可以像这样进行转换

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.