为了对我在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
这可以以更优雅的方式完成吗?
答案 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
答案 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分钟内的秒数)