MYSQL日期时间到最近一小时

时间:2012-03-13 07:49:28

标签: mysql datetime

我在MySQL数据库中有一个日期时间字段,希望将结果输出到最近的小时。

e.g。 2012-04-01 00:00:01应为2012-04-01 00:00:00

8 个答案:

答案 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_FORMATDATE_FORMAT(the_date, "%Y-%m-%d %H:00:00")将截断的日期返回到最接近的小时(将分钟和秒钟设置为零)。

  • MINUTEMINUTE(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毫秒(快速,但不适用于夏令时)
  • 我的方法3:0.1255 ms
  • 我的方法2:0.1289 ms
  • Ben Lee的DATE_FORMAT方法:0.1495 ms
  • 我的方法1:0.1506毫秒

答案 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)

要舍入到当前时间,请选择:

FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(column_name) / 3600) * 3600)

  

该值以当前时区doc

表示

答案 6 :(得分:0)

如果你需要将时间缩短到下一个小时,你可以使用它:

0xNNN...

答案 7 :(得分:0)

我认为这是最好的方式,因为它也会使用最少量的资源 -

date_add(date(date_completed), interval hour(date_completed) hour) as date_hr