如何在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()
。
希望这可以帮助。