我在MySQL数据库中有一个日期时间字段,希望将结果输出到最近的小时。
e.g。 2012-04-01 00:00:01
应为2012-04-01 00:00:00
答案 0 :(得分:43)
更新:我认为https://stackoverflow.com/a/21330407/480943是一个更好的答案。
你可以用一些日期算术来做:
SELECT some_columns,
DATE_ADD(
DATE_FORMAT(the_date, "%Y-%m-%d %H:00:00"),
INTERVAL IF(MINUTE(the_date) < 30, 0, 1) HOUR
) AS the_rounded_date
FROM your_table
说明:
DATE_FORMAT:DATE_FORMAT(the_date, "%Y-%m-%d %H:00:00")
将截断的日期返回到最接近的小时(将分钟和秒钟设置为零)。
MINUTE:MINUTE(the_date)
获取日期的分钟值。
IF:这是有条件的;如果参数1中的值为true,则返回参数2,否则返回参数3.因此IF(MINUTE(the_date) < 30, 0, 1)
表示“如果分钟值小于30,则返回0,否则返回1”。这就是我们将要使用的内容 - 这是重新添加的小时数。
DATE_ADD:这会将该轮次的小时数添加到结果中。
答案 1 :(得分:27)
半小时是30分钟。只需将30分钟添加到时间戳并截断分钟和秒钟。
SELECT DATE_FORMAT(DATE_ADD(timestamp_column, INTERVAL 30 MINUTE),'%Y-%m-%d %H:00:00') FROM table
答案 2 :(得分:12)
灵魂的第一个解决方案截断而不是舍入,第二个解决方案不适用于夏令时案例,例如:
select FROM_UNIXTIME(UNIX_TIMESTAMP('2012-03-11 2:14:00') - MOD(UNIX_TIMESTAMP('2012-03-11 2:14:00'),300));
这是另一种方法(1):
DATE_ADD(
tick,
INTERVAL (IF((MINUTE(tick)*60)+SECOND(tick) < 1800, 0, 3600) - (MINUTE(tick)*60)+SECOND(tick)) SECOND
)
如果你不需要担心几秒钟,你可以像这样简化它(2):
DATE_ADD(
tick,
INTERVAL (IF(MINUTE(tick) < 30, 0, 60) - MINUTE(tick)) MINUTE
)
或者如果你喜欢截断而不是圆形,这里是灵魂方法的简单版本(3):
DATE_SUB(tick, INTERVAL MINUTE(tick)*60+SECOND(tick) SECOND)
编辑:我在本地计算机上查询了一些这些查询,发现100,000行的平均时间如下:
UNIXTIME
方法:0.0423毫秒(快速,但不适用于夏令时)DATE_FORMAT
方法:0.1495 ms 答案 3 :(得分:6)
来自How to round a DateTime in MySQL?:
使用日期时间数据类型时,这有点令人讨厌;存储函数的一个很好的候选者。
DATE_SUB(DATE_SUB(time, INTERVAL MOD(MINUTE(time),5) MINUTE ), INTERVAL SECOND(time) SECOND)
使用UNIXTIME时间戳时更容易,但这仅限于1970 - 2038日期范围。
祝你好运。FROM_UNIXTIME(UNIX_TIMESTAMP(time) - MOD(UNIX_TIMESTAMP(time),300))
答案 4 :(得分:1)
这将返回下一个小时,即'2012-01-02 18:02:30'
将转换为'2012-01-02 19:00:00'
TIMESTAMPADD(HOUR,
TIMESTAMPDIFF(HOUR,CURDATE(),timestamp_column_name),
CURDATE())
您可以使用任意日期代替CURDATE()
,例如'2000-01-01'
如果系统日期在函数的两次调用之间发生变化,则不确定使用CURDATE()
是否存在问题,不知道Mysql是否会同时调用这两个函数。
获取最近的小时将是:
TIMESTAMPADD(MINUTE,
ROUND(TIMESTAMPDIFF(MINUTE,CURDATE(),timestamp_column_name)/60)*60,
CURDATE())
将60改为15将获得最接近的15分钟间隔,使用SECOND可以获得最接近的所需第二间隔等。
要获取前一小时,请使用TRUNCATE()
或FLOOR()
代替ROUND()
。
希望这有帮助。
答案 5 :(得分:1)
答案 6 :(得分:0)
如果你需要将时间缩短到下一个小时,你可以使用它:
0xNNN...
答案 7 :(得分:0)
我认为这是最好的方式,因为它也会使用最少量的资源 -
date_add(date(date_completed), interval hour(date_completed) hour) as date_hr