2

为了对网络服务器上的传入数据进行一些统计,我对这些数据进行了一些 ETL 工作。所以我根据一刻钟来汇总一些东西。IE:

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列,其中还包含一个日期(我只是为了演示目的而忽略了它)。该作业通过 cron 每 3 分钟运行一次,并且仅获取最后 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

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

4

3 回答 3

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

SQL Fiddle 上的实时示例。

于 2012-06-24T18:58:35.610 回答
1

你很亲密。这个怎么样?

  SELECT DATE_FORMAT( a.inserted '%Y-%m-%d %H:00:00') +
     INTERVAL (MINUTE(a.inserted) - MINUTE(a.inserted)%15) MINUTE   
于 2012-06-24T18:59:55.270 回答
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 分钟内的秒数)

于 2012-06-24T19:00:38.380 回答