如何在MySQL中舍入DateTime?

我想以5分钟的分辨率将DateTime离散化。 我在C#中做过,但是如何将以下代码转换为MySQL?

DateTime Floor(DateTime dateTime, TimeSpan resolution) { return new DateTime ( timeSpan.Ticks * (long) Math.Floor ( ((double)dateTime.Ticks) / ((double)resolution.Ticks) ) ); } 

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

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

祝好运。

你可以看看这里 。 此示例是舍入到最接近的X分钟的一般情况,并且是用T-SQL编写的,但逻辑和大多数函数在两种情况下都是相同的。

 from_unixtime(floor(unix_timestamp('2006-10-10 14:26:01')/(60*5))*(60*5)) +---------------------------------------------------------------------------+ | from_unixtime(floor(unix_timestamp('2006-10-10 14:26:01')/(60*5))*(60*5)) | +---------------------------------------------------------------------------+ | 2006-10-10 14:25:00 | +---------------------------------------------------------------------------+ 1 row in set (0.00 sec) 

你可以用其他值替换这两个5

你有没有看过MySQL中的CASTfunction?

  • MySQL Cast
  • 演员函数和运算符

这是基于该线程的解决方案的另一种变体。

 SELECT DATE_ADD( DATE_FORMAT(time, "%Y-%m-%d %H:00:00"), INTERVAL FLOOR(MINUTE(time)/5)*5 MINUTE ); 

与使用FROM_UNIXTIME解决方案不同,此解决方案将为夏令时(DST)转换中的日期时间提供预期值。 (比较例如2012-11-03 2:14:00)

编辑 – 经过一些快速基准测试后,奥利的第一个解决方案似乎比这更快。 但我仍然建议不要使用FROM_UNIXTIME方法。

另一种选择:

得到最近的小时:

 TIMESTAMPADD(MINUTE, ROUND(TIMESTAMPDIFF(MINUTE,CURDATE(),timestamp_column_name)/60)*60, CURDATE()) 

而不是CURDATE()你可以使用任意日期,例如'2000-01-01'如果系统日期在两次调用函数之间发生变化,不确定使用CURDATE()是否会出现问题,不知道是否Mysql会同时调用它们。

将60改为15将获得最接近的15分钟间隔,使用SECOND可以获得最接近的所需第二间隔等。

要获得前一个小时,请使用TRUNCATE()FLOOR()而不是ROUND()

希望这可以帮助。