mysql - 使用 mySQL 将时间舍入到最接近的 6 分钟

标签 mysql datetime

我在 mySQL (fromStamp) 中有一个 DATETIME 字段,其中包含一个有效的日期/时间戳。 我需要能够将分钟向上舍入到下一个 6 分钟间隔。秒数应被忽略或视为 :00

所以,如果我的 DATETIME 是 2013-01-31 13:07:17,我需要的结果是 2013-01-31 13:12:00 除了 :00 和 :06 以及 :31 和 :36 之间的时间之外,这些时间需要DOWN

 :00-06 round DOWN to 00
 :07-12 round UP to 12
 :13-18 round UP to 18
 :19-24 round UP to 24
 :24-30 round UP to 30
 :31-36 round DOWN to 30
 :37-42 round UP to 42
 :43-48 round UP to 48
 :49-54 round UP to 54
 :55-00 round UP to 00

我找到了一种合理的方法来选择性地向下舍入:

SELECT
  fromStamp, 
  CONCAT(DATE_FORMAT(`fromStamp`, '%Y-%m-%d'), ' ',
         SEC_TO_TIME((TIME_TO_SEC(`fromStamp`) DIV 360) * 360))
FROM `table` 
WHERE (
    DATE_FORMAT(`fromStamp`, '%i') BETWEEN 0 AND 6 
    OR DATE_FORMAT(`fromStamp`, '%i') BETWEEN 31 AND 36
);

是否有一种好方法可以将其他所有内容四舍五入到下一个 6 分钟间隔? (我觉得我错过了一些简单的东西)

更新

所以我将采用@mellamokb 的解决方案,但他关于秒数的评论是正确的,它确实发挥了作用。

DATETIME 2013-01-22 12:24:13 四舍五入到 12:30,这不是需要的,所以我先做:

UPDATE table SET fromStamp = CONCAT(DATE_FORMAT(fromStamp, '%Y-%m-%d %h:%i'), ':00'); 

为了摆脱秒数,然后他的查询得到了我正在寻找的东西。

最佳答案

四舍五入是非常相似的逻辑,除了您添加 1 以转移到下一个最近的 6 分钟 间隔。我还从 TIME_TO_SEC 中减去 1 作为校正因子,否则 06:00 等临界值会在接下来的 6 分钟内上移间隔,即 12:00

SEC_TO_TIME( ( (TIME_TO_SEC(`fromStamp`) - 1) DIV 360 + 1) * 360))
                                                      ^^^ add one

要将两者结合起来,请使用 CASE 语句来控制每条记录使用哪种舍入形式:

SELECT
  fromStamp, 
  CASE WHEN
    DATE_FORMAT(`fromStamp`, '%i') BETWEEN 0 AND 6 
    OR DATE_FORMAT(`fromStamp`, '%i') BETWEEN 31 AND 36
  THEN
    CONCAT(DATE_FORMAT(`fromStamp`, '%Y-%m-%d'), ' ',
         SEC_TO_TIME((TIME_TO_SEC(`fromStamp`) DIV 360) * 360))
  ELSE
    CONCAT(DATE_FORMAT(`fromStamp`, '%Y-%m-%d'), ' ',
         SEC_TO_TIME(((TIME_TO_SEC(`fromStamp`) - 1) DIV 360 + 1) * 360))
  END
FROM `table`

( DEMO )

关于mysql - 使用 mySQL 将时间舍入到最接近的 6 分钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14626982/

相关文章:

mysql - 是否有 RCF2822 格式的日期时间数据类型?

mysql - 事件记录 : Invalid date when querying varchar

mysql - 是否可以将数据插入到数据库中按顺序出现的具有唯一id的表而不加锁?

java - 如何在eclipse中使用maven和jpa连接mysql数据库?

Javascript 转换时间戳

sql - 在转换之前验证日期,也就是。 ISDATE() 等效

mysql - SQL 交集和并集

mysql - 更新两个表 - 错误 - 'product_varities.product_varities_id' 中的未知列 'where clause'

c# 将字符串转换为日期时间

c# - 下一个凌晨 3 点发生的日期时间