【问题标题】:How to get the beginning of a minute from datetime in MariaDB/MySQL?如何从 MariaDB/MySQL 中的日期时间获取一分钟的开始?
【发布时间】:2020-06-08 18:36:37
【问题描述】:

我正在实现一个聚合统计表,该表将包含存储在另一个表中的每分钟实时数据聚合。为了实现这一点,我相信我需要一种方法来从datetime 获取一分钟的开始。

例如如果 datetime 是 dt='2020-06-08 21:20:33' ,我需要一个函数 F(dt)='2020-06-08 21:20:00',这样我就可以在查询中在 NOW() 上调用它。

到目前为止,由于 datetime-string-datetime 路由,我可以想到以下可能会很慢:

SELECT STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m%d%H%i00'), '%Y%m%d%H%i%S') AS MinuteBeginning

您能否提供一个更有效的解决方案,也许是一个存储过程?如果 MySQL 解决方案与 MariaDB 不同,则首选后者。

【问题讨论】:

  • 从时间戳中减去秒数,在标准 SQL current_timestamp - (extract(second from current_timestamp) * interval '1' second)
  • @dnoeth,如果时间戳有微秒,这似乎是错误的,不是吗?
  • 在标准 SQL 中,它按预期工作,提取包含亚秒部分,因此提取(从时间 '12:34:56.7687' 开始的第二个)结果为 56.7687

标签: mysql sql performance datetime mariadb


【解决方案1】:

你也可以使用 Unix 纪元:

from_unixtime(floor(unix_timestamp() / 60) * 60)

整数运算应该快一点。但是,在聚合查询中,数据混洗通常比其他操作更昂贵。

【讨论】:

    【解决方案2】:

    如果 Y2038 是一个问题,字符串操作是另一种选择:

    select now(), CONCAT(LEFT(NOW(), 17), '00');
    +---------------------+-------------------------------+
    | now()               | CONCAT(LEFT(NOW(), 17), '00') |
    +---------------------+-------------------------------+
    | 2020-06-08 23:24:59 | 2020-06-08 23:24:00           |
    +---------------------+-------------------------------+
    

    【讨论】:

    • 结果似乎是字符串类型而不是日期时间。需要演员表吗?
    • @SergeRogatch - 在大多数情况下,没有。看起来像日期或日期时间的字符串很容易被这样处理。
    猜你喜欢
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多