4

私のテーブルが次のようになっているとしましょう。

Sessions
start_dts (datetime)
end_dts (datetime)

データは次のようになります。

start_dts             end_dts
12/25/2011 01:55:00   12/25/2011 03:30:00

クエリ結果は次のようになります。

Date          Hour    MinutesOnline
12/25/2011    0       0
12/25/2011    1       5
12/25/2011    2       60
12/25/2011    3       30
... (every hour of the date range being queried)

これは単一のクエリでも可能ですか?

4

2 に答える 2

1

これはかなり良いスタートです。これは、任意の日付/時刻範囲で機能します。ただし、主な前提条件が1つあります。スキャンするすべての間隔を含むフィールドを intervals持つテーブルを作成する必要があります。dt_hr datetime

Ex: '2011-12-25 00:00:00',
    '2011-12-25 01:00:00',
    '2011-12-25 02:00:00',
    '2011-12-25 03:00:00',
          . . .
    '2011-12-25 23:00:00'

-

SELECT DATE_FORMAT(intervals.dt_hr,'%m/%d/%Y') AS Date,
       EXTRACT(HOUR FROM intervals.dt_hr) AS Hour,
       CASE 
          WHEN intervals.dt_hr > TIMESTAMPADD(HOUR,HOUR(s2.start_dts), DATE(s2.start_dts)) 
               AND intervals.dt_hr < TIMESTAMPADD(HOUR,HOUR(s2.end_dts), DATE(s2.end_dts))
            THEN 60
          WHEN intervals.dt_hr = TIMESTAMPADD(HOUR,HOUR(s2.start_dts), DATE(s2.start_dts)) 
               AND intervals.dt_hr < TIMESTAMPADD(HOUR,HOUR(s2.end_dts), DATE(s2.end_dts))
            THEN 60 - EXTRACT(MINUTE FROM s2.start_dts)
          WHEN intervals.dt_hr = TIMESTAMPADD(HOUR,HOUR(s2.end_dts), DATE(s2.end_dts))
               AND intervals.dt_hr > TIMESTAMPADD(HOUR,HOUR(s2.start_dts), DATE(s2.start_dts)) 
            THEN EXTRACT(MINUTE FROM s2.end_dts)
          WHEN intervals.dt_hr = TIMESTAMPADD(HOUR,HOUR(s2.start_dts), DATE(s2.start_dts)) 
               AND intervals.dt_hr = TIMESTAMPADD(HOUR,HOUR(s2.end_dts), DATE(s2.end_dts))
            THEN EXTRACT(MINUTE FROM s2.end_dts) - EXTRACT(MINUTE FROM s2.start_dts)
          ELSE 0
       END AS MinutesOnLine
FROM intervals
LEFT JOIN sessions s2 
  ON intervals.dt_hr >= TIMESTAMPADD(HOUR,HOUR(s2.start_dts), DATE(s2.start_dts)) 
    AND intervals.dt_hr <= TIMESTAMPADD(HOUR,HOUR(s2.end_dts), DATE(s2.end_dts))

テーブルを生成するためintervalsに、date_hourシーケンスで一時テーブルを作成するストアドプロシージャを作成できます。これを行う方法については 、2つの日付の間の日付のリストを取得するを参照してください。

于 2012-08-07T23:58:36.470 に答える
0

答えよりも大きなコメントです。

MySQLではそれを行うには十分ではありませんが、CTEはstart_dtsとend_dtsの間の日時のセットを考え出すので、

startTime           endTime     
12/25/2011 01:00:00 12/25/2011 02:00:00
12/25/2011 02:00:00 12/25/2011 03:00:00
12/25/2011 03:00:00 12/25/2011 04:00:00

CT.EndTime <DateAdd(sessions.end_dts、INTERVAL 1 HOUR)でセッションに参加しました

次に、Hour(CTS.StartTime)-Hour(sessions.start_dts)と、cte.endtimeとstart_dtsの間の時間差のモジュラス(分単位)

多分...

于 2012-08-07T23:46:54.180 に答える