2

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列で、日付も含まれています (説明のために省略しました)。ジョブは 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 に答える