1

null の場合は、デフォルトの end_datetime を使用して、時系列の集計として 2 つのタイム スタンプ間の期間 (秒単位) を計算できる必要があります。

ユーザー名、start_datetime、end_datetime を入力および出力するときに、パンチ カードのようなものがあると想像してください。

私が欲しいのは、その時間枠内で重複するすべてのユーザーの期間を持つ最後の N 分間の生成された時系列です。したがって、それがnullの場合、デフォルトのend_datetimeを合体させるのはSUM(end_datetime - start_datetime)になります。

したがって、私が必要だと思う基本的な部分は次のとおりです。

時間間隔を生成します。

select TIMESTAMP '2013-01-01 12:01:00' - (interval '1' minute * generate_series(0,5)) as timestamps;

COALESCE デフォルトの end_datetime

COALESCE(end_datetime, NOW())

開始日と終了日の秒差を計算する

したがって、1 人のユーザーが 11:56:50 にログインし、現在は 12:01:40 である場合、次のようなテーブルを取得する必要があります。

     timestamps          duration
-------------------------------------
 2013-01-01 12:01:00        40
 2013-01-01 12:00:00        60
 2013-01-01 11:59:00        60
 2013-01-01 11:58:00        60
 2013-01-01 11:57:00        60
 2013-01-01 11:56:00        10
4

1 に答える 1

2
with t as (select '2013-01-01 11:56:50'::timestamp startt, '2013-01-01 12:01:40'::timestamp endt)

select
   timestamps,
   extract(epoch from 
   case 
      when timestamps=date_trunc('minute',startt) then date_trunc('minute',startt) + interval '1 minute' - startt
      when timestamps =date_trunc('minute',endt) then endt- date_trunc('minute',endt)
      else interval '60 seconds' end) as durations
from
   (select generate_series(date_trunc('minute',startt),date_trunc('minute',endt),'1 minute') timestamps, * from t) a
order by
   timestamps desc;

2013-01-01 12:01:00;40
2013-01-01 12:00:00;60
2013-01-01 11:59:00;60
2013-01-01 11:58:00;60
2013-01-01 11:57:00;60
2013-01-01 11:56:00;10

開始タイムスタンプと終了タイムスタンプを持つ複数の行がある場合は、次のように動作します。

select
   id,
   timestamps,
   extract(epoch from 
   case 
      when timestamps=date_trunc('minute',startt) then date_trunc('minute',startt) + interval '1 minute' - startt
      when timestamps =date_trunc('minute',endt) then endt- date_trunc('minute',endt)
      else interval '60 seconds' end) as durations
from
   (
      select 
      id,
      generate_series(date_trunc('minute',startt) ,
                      coalesce(date_trunc('minute',endt),date_trunc('minute',Now())),'1 minute') as timestamps,
      startt, endt
   from test
   ) a
order by
   id, timestamps desc

SQLフィドル

于 2013-09-18T06:37:53.680 に答える