MYSQL日期时间到最近一小时

use*_*917 38 mysql datetime

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

例如2012-04-01 00:00:01应该读2012-04-01 00:00:00

Ben*_*Lee 44

更新:我认为/sf/answers/1493128521/是一个更好的答案.


你可以用一些日期算术来做到这一点:

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
Run Code Online (Sandbox Code Playgroud)

说明:

  • 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:这会将轮次的小时数添加到结果中.


rjh*_*dby 31

半小时是30分钟.只需添加30分钟的时间戳并截断分钟和秒.

SELECT DATE_FORMAT(DATE_ADD(timestamp_column, INTERVAL 30 MINUTE),'%Y-%m-%d %H:00:00') FROM table


Cod*_*der 12

灵魂的第一个解决方案截断而不是舍入,第二个解决方案不适用于夏令时案例,例如:

select FROM_UNIXTIME(UNIX_TIMESTAMP('2012-03-11 2:14:00') - MOD(UNIX_TIMESTAMP('2012-03-11 2:14:00'),300));
Run Code Online (Sandbox Code Playgroud)

这是另一种方法(1):

DATE_ADD(
    tick,
    INTERVAL (IF((MINUTE(tick)*60)+SECOND(tick) < 1800, 0, 3600) - (MINUTE(tick)*60)+SECOND(tick)) SECOND
)
Run Code Online (Sandbox Code Playgroud)

如果您不需要担心秒钟,可以像这样简化它(2):

DATE_ADD(
    tick,
    INTERVAL (IF(MINUTE(tick) < 30, 0, 60) - MINUTE(tick)) MINUTE
)
Run Code Online (Sandbox Code Playgroud)

或者如果你喜欢截断而不是圆形,这里是灵魂方法的简单版本(3):

DATE_SUB(tick, INTERVAL MINUTE(tick)*60+SECOND(tick) SECOND)
Run Code Online (Sandbox Code Playgroud)

编辑:我在本地计算机上查询了一些这些查询,发现对于100,000行,平均时间如下:

  • 灵魂的UNIXTIME方法:0.0423毫秒(快速,但不适用于夏令时)
  • 我的方法3:0.1255毫秒
  • 我的方法2:0.1289毫秒
  • Ben Lee的DATE_FORMAT方法:0.1495毫秒
  • 我的方法1:0.1506毫秒


Gho*_*man 6

如何在MySQL中舍入DateTime?:

使用datetime数据类型时,这有点令人讨厌; 存储函数的一个很好的候选者.

DATE_SUB(DATE_SUB(time, INTERVAL MOD(MINUTE(time),5) MINUTE ), 
         INTERVAL SECOND(time) SECOND)
Run Code Online (Sandbox Code Playgroud)

使用UNIXTIME时间戳时更容易,但这仅限于1970 - 2038年的日期范围.

FROM_UNIXTIME(UNIX_TIMESTAMP(time) - MOD(UNIX_TIMESTAMP(time),300))
Run Code Online (Sandbox Code Playgroud)

祝好运.

  • 请注意这一点。对于介于夏令时更改之间的日期时间,Unix时间方法会失败。例如:`select FROM_UNIXTIME(UNIX_TIMESTAMP('2012-03-11 2:14:00')-MOD(UNIX_TIMESTAMP('2012-03-11 2:14:00'),300));` (2认同)

小智 5

要向下舍入到当前小时,请选择:

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

该值以当前时区doc 表示