时间计算(到下一个时段的圆周时间)

时间:2012-06-24 18:39:22

标签: mysql sql datetime time

为了对我在Web服务器上的传入数据进行一些统计,我会对这些数据进行一些ETL工作。所以我根据季度时间汇总了一些东西。即:

inserted  | tstamp
8:00        8:00
8:09        8:00
8:16        8:15
8:29        8:15
8:42        8:30
8:45        8:45
8:59        8:45
9:01        9:00

上面的列是datetime列,其中还包含一个日期(我只是出于演示目的而将其遗漏)。该作业每3分钟通过cron运行一次,仅获取最近3分钟的数据。现在,当cron作业在工作时崩溃时,存在风险,即下次作业重新启动时,时隙包含错误的数据。所以我希望这份工作能够在最后一个时段开始。即当工作在最后的08:24运行并且崩溃时,应该在08:15再次开始。

我的问题是,是否有一个简单的MySQL语句,它给出了实际时间之前的最后一个时间段?

我在ETL中用来确定实际时间段的语句是

CONCAT(
    DATE_FORMAT(a.inserted, '%Y-%m-%d %H:'),
    IF(MINUTE(a.inserted)<15,'00',
        IF(MINUTE(a.inserted)<30,'15',
        IF(MINUTE(a.inserted)<45,'30',
        '45'))
    ),
    ':00'
) AS tstamp

这可以以更优雅的方式完成吗?

3 个答案:

答案 0 :(得分:2)

您可以使用unix_timestamp()来获取自1970年以来的秒数当前时间。最后3分钟的时间间隔是模3 * 60秒的时间:

select  from_unixtime(unix_timestamp() - mod(unix_timestamp(), 180))
            as StartOfInterval
,       from_unixtime(unix_timestamp() - mod(unix_timestamp(), 180)-180) 
            as StartOfLastInterval

Live example at SQL Fiddle.

答案 1 :(得分:1)

你非常接近。怎么样?

  SELECT DATE_FORMAT( a.inserted '%Y-%m-%d %H:00:00') +
     INTERVAL (MINUTE(a.inserted) - MINUTE(a.inserted)%15) MINUTE   

答案 2 :(得分:1)

只需使用FLOOR()将分钟向下舍入为15的倍数:

CONCAT(DATE_FORMAT(a.inserted, '%Y-%m-%d %H:'), 
    15 * FLOOR(MINUTE(a.inserted) / 15)), ':00') AS tstamp

或使用FLOOR()的时间和格式:

DATE_FORMAT(FROM_UNIXTIME(900 * FLOOR(UNIX_TIMESTAMP(a.inserted) / 900)), '%Y-%m-%d %H:%M:%s') as tstamp

900是15分钟内的秒数)