3

誰かが顧客のAエントリとBエントリの間の期間を返すMSSQLServer2000クエリを作成するのを手伝ってくれるなら、私は本当に助けていただければ幸いです。

すべての顧客がBレコードを持っているとは限らないため、結果は返されません。

顧客監査

+ --- + --------------- + --- + ---------------------- +
| 1 | ピーター・グリフィン| A | 2013-01-01 15:00:00 |
| 2 | マーティンビッグス| A | 2013-01-02 15:00:00 |
| 3 | ピーター・グリフィン| C | 2013-01-05 09:00:00 |
| 4 | スーパーマリオ| A | 2013-01-01 15:00:00 |
| 5 | マーティンビッグス| B | 2013-01-03 18:00:00 |
+ --- + --------------- + --- + ---------------------- +

私は次のような結果を期待しています:

+ -------------- + ---------------- +
| マーティンビッグス| 1日3時間|
+ -------------- + ---------------- +
4

3 に答える 3

4

以下のようなもの(スキーマがわからないため、オブジェクトの名前を変更する必要があります)で十分です。

SELECT ABS(DATEDIFF(HOUR, CA.TheDate, CB.TheDate)) AS HoursBetween
FROM dbo.Customers CA
INNER JOIN dbo.Customers CB
ON CB.Name = CA.Name
AND CB.Code = 'B'
WHERE CA.Code = 'A'
于 2013-01-18T12:44:06.207 に答える
1
SELECT A.CUSTOMER, DATEDIFF(HOUR, A.ENTRY_DATE, B.ENTRY_DATE) DURATION
FROM CUSTOMERSAUDIT A, CUSTOMERSAUDIT B
WHERE B.CUSTOMER = A.CUSTOMER AND B.ENTRY_DATE > A.ENTRY_DATE
于 2013-01-18T12:47:28.457 に答える
0

これはOracleクエリですが、私が知る限り、MSServerで利用できるすべての機能があります。目的の結果を得るために出力を連結する方法を説明する必要はないと確信しています。出力のすべての値は、日、時間などの別々の列になります。ここで出力をフォーマットするのは必ずしも簡単ではありません。

SELECT id, name, grade
     , NVL(EXTRACT(DAY    FROM day_time_diff), 0) days
     , NVL(EXTRACT(HOUR   FROM day_time_diff), 0) hours
     , NVL(EXTRACT(MINUTE FROM day_time_diff), 0) minutes
     , NVL(EXTRACT(SECOND FROM day_time_diff), 0) seconds
  FROM
  (
   SELECT id, name, grade
       , (begin_date-end_date) day_time_diff
     FROM
     (
      SELECT id, name, grade
           , CAST(start_date AS TIMESTAMP)  begin_date
           , CAST(end_date AS TIMESTAMP)    end_date
        FROM
         (
          SELECT id, name, grade, start_date
               , LAG(start_date, 1, to_date(null)) OVER (ORDER BY id)  end_date 
            FROM stack_test
         )
     )
   )
   /

Output:

ID  NAME           GRADE    DAYS    HOURS   MINUTES SECONDS
------------------------------------------------------------
 1  Peter Griffin   A       0        0      0       0
 2  Martin Biggs    A       1        1      0       0
 3  Peter Griffin   C       2        17     0       0
 4  Super Mario     A      -3       -18     0       0
 5  Martin Biggs    A       2        3      0       0

私が使用したテーブル構造/列-これとデータを事前に処理しておくと便利です。

CREATE TABLE stack_test
 (
  id        NUMBER
 ,name      VARCHAR2(50) 
 ,grade     VARCHAR2(3)
 ,start_date DATE
)
/
于 2013-01-18T14:27:21.160 に答える