0

以下のクエリを使用して、2 つの時間レコード間の時差を取得しています

;WITH x AS 
(
  SELECT *, 
    rn = ROW_NUMBER() OVER (PARTITION BY PersonRFID ORDER BY TimeStamp)
  FROM AISDb
)
SELECT y.ID,x.ID,x.PersonName,x.PersonRFID, DATEDIFF(MINUTE, x.TimeStamp, y.TimeStamp) 
  FROM x INNER JOIN x AS y 
  ON x.PersonRFID = y.PersonRFID
  AND x.rn = y.rn - 1
  WHERE x.Action = 'OUT'
  AND y.Action = 'IN';
ID   Name         PERSONRFID                   ACTION  LOGREAD  TIMESTAMP      DATESTAMP

1  Kashif Islam E20010018303014826000F5A    IN  True    20:43:00    1/16/2013

8  Kashif Islam E20010018303014826000F5A    IN  True    12:22:00    1/26/2013

10 Kashif Islam E20010018303014826000F5A    OUT True    12:22:00    1/26/2013

11 Aamir Munir  E20010018303020025901029    IN  True    12:22:00    1/26/2013

15 Aamir Munir  E20010018303020025901029    OUT True    11:46:00    1/29/2013

25 Kashif Islam E20010018303014826000F5A    OUT True    12:41:00    1/29/2013

問題は、同じ日に IN OUT ペアを作成するのと同じ日に良い結果が得られることです。しかし、同じ日に次の OUT が見つからない場合、たとえば 2013 年 1 月 16 日の日付で ID が 1 の場合、OUT アクションを取得しないため、ID 25 とペアになります。これは行うべきではありません。要するに、日付も処理し、同じ日付の IN OUT 紙を作成し、そうでない場合は無視するクエリが必要です。親切に助けてください

4

1 に答える 1

0

日付に比較を追加するだけです。

WITH x AS 
(
  SELECT *, 
    rn = ROW_NUMBER() OVER (PARTITION BY PersonRFID ORDER BY TimeStamp)
  FROM AISDb
)
SELECT y.ID,x.ID,x.PersonName,x.PersonRFID, DATEDIFF(MINUTE, x.TimeStamp, y.TimeStamp) 
FROM x INNER JOIN
      x AS y 
     ON x.PersonRFID = y.PersonRFID and
        x.rn = y.rn - 1 and
        x.Action = 'OUT' and
        y.Action = 'IN' and
        cast(x.timestamp as date) = cast(y.timestamp as date);

日付への変換を行うために SQL Server 構文を使用しています。

一致する Y がない場合でも、すべての「X」レコードが必要な場合は、左外部結合が必要です。クエリを次のように記述します。

SELECT y.ID,x.ID,x.PersonName,x.PersonRFID, DATEDIFF(MINUTE, x.TimeStamp, y.TimeStamp) 
FROM x INNER JOIN
      x AS y 
     ON x.PersonRFID = y.PersonRFID and
        x.rn = y.rn - 1 and
        y.Action = 'IN' and
        cast(x.timestamp as date) = cast(y.timestamp as date);
where x.Action = 'OUT'
于 2013-03-29T12:33:31.000 に答える