如何将时间舍入到最接近的15分钟段落

25

如何在MySQL中将时间舍入到最接近的15分钟(例如,0、15、30、45)?


1
你能展示一下你到目前为止所做的任何事情吗? :-) 然后我们可以相应地提供建议。 - bonCodigo
为什么不使用timestampdiffmod?顺便说一下,我撤回之前的评论,因为我没有注意到答案是由您提供的。您可以通过附加代码来更新您的问题 :-) - bonCodigo
3个回答

35
SELECT SEC_TO_TIME(FLOOR((TIME_TO_SEC(CURTIME())+450)/900)*900)
在这个例子中,我使用了CURTIME()作为输入时间,但是你可以使用任何时间字段。
900秒= 15分钟(要四舍五入的周期),450秒是其中一半(提供四舍五入的元素)。我已经测试过1800/900以获得最近的半小时,应该适用于其他时间(例如600/300代表10分钟等)。

如果需要相应的15分钟块,请删除“450”。 - Amil Waduwawara

21
SELECT FROM_UNIXTIME( ROUND(UNIX_TIMESTAMP(NOW()) / 900,0)*900);

这可以推广到任何时间值进行舍入。900秒等于15分钟。您可以使用任何其他舍入因子替换900。


是的,900可以更改为任何时间,但是您提供的代码仅会向下舍入。 - donL
1
请使用CEIL()代替TRUNCATE()。 - Gavin Towey
2
为了获得更好(更快)的结果,请使用整数除法(向下取整,而不是向上取整,但这并不重要)- 或者将“MOD 900”从数字中减去而不是除以和乘以。 - Ariel

0

这是我使用的一些粗略代码,使结果非常接近我想要的。因为我没有使用秒,所以我只选择了靠近中间位置的分钟。

SELECT
       CASE 
            WHEN minute(timeIn) BETWEEN 0 and 7 THEN SEC_TO_TIME((TIME_TO_SEC(timeIn) DIV 3600) * 3600)
            WHEN minute(timeIn) BETWEEN 8 and 22 THEN ADDTIME(SEC_TO_TIME((TIME_TO_SEC(timeIn) DIV 3600) * 3600), '00:15:00')
            WHEN minute(timeIn) BETWEEN 23 and 37 THEN ADDTIME(SEC_TO_TIME((TIME_TO_SEC(timeIn) DIV 3600) * 3600), '00:30:00')
            WHEN minute(timeIn) BETWEEN 38 and 52 THEN ADDTIME(SEC_TO_TIME((TIME_TO_SEC(timeIn) DIV 3600) * 3600), '00:45:00')
            WHEN minute(timeIn) BETWEEN 53 and 59 THEN ADDTIME(SEC_TO_TIME((TIME_TO_SEC(timeIn) DIV 3600) * 3600), '01:00:00')
       END as 15_min
    FROM
      clock.punches;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接