2013-01-18 104 views
3

如果有人能夠幫助我構建一個MSSQL Server 2000查詢來返回客戶的A條目和B條目之間的持續時間,我將非常感激。不同行之間的兩個日期之間的SQL持續時間

並非所有客戶都有B記錄,因此不會返回任何結果。

客戶審計

 
+---+---------------+---+----------------------+ 
| 1 | Peter Griffin | A | 2013-01-01 15:00:00 | 
| 2 | Martin Biggs | A | 2013-01-02 15:00:00 | 
| 3 | Peter Griffin | C | 2013-01-05 09:00:00 | 
| 4 | Super Mario | A | 2013-01-01 15:00:00 | 
| 5 | Martin Biggs | B | 2013-01-03 18:00:00 | 
+---+---------------+---+----------------------+ 

,我希望類似的結果:

 
+--------------+----------------+ 
| Martin Biggs | 1 day, 3 hours | 
+--------------+----------------+ 

回答

3

喜歡的東西下面的(不知道你的模式,所以你需要改變對象的名稱)就足夠了。

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' 
+0

我們如何確定'CB.TheDate'會比其他日期更大?否則'DATEDIFF'可能會導致負小時? :) – bonCodigo

+1

@bonCodigo - 對,我們無法從規範和單例中推斷出這一點,如果日期可能是'相反方向',那麼可以通過ABS(...)輕鬆解決(現在添加到答案中)。 –

+0

這是足夠的信息供我使用 - 我也學過了ABS功能:) – user1990366

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 
0

這是Oracle查詢,但所有的功能提供MS服務器就我知道的。我確信我不必告訴你如何連接輸出以獲得所需的結果。在輸出的所有值都會在單獨的列 - 天,小時,等...它並不總是很容易在這裏格式化輸出:我用

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 
) 
/
相關問題