找茬

2014-04-10 22 views
0

我已詢問:找茬

SELECT  
MemberId, 
     FirstName,LastName, 
     [DateOfChange]   
     ,(select title from StatusList where idStatus=[OldStatus]) as [OldStatus] 
     ,(select title from StatusList where idStatus=[NewStatus]) as [NewStatus] 
    FROM [statusLog] , Users where 
    statusLog.IdUser=Users.IdUser 

此查詢給我下面的結果:

enter image description here

我有一個列狀態OLDSTATUS和NEWSTATUS和DateOfChange。

我只是想在狀態改變的小時數上有所不同。

即從DateOfChange舊狀態OnCall中巡邏我想找到兩個日期之間的區別:

2014-04-04 16:13:33:000 and 2014-04-04 16:13:44:000 

我想:

SELECT  
MemberId, 
     FirstName,LastName, 
     [DateOfChange], 
     DATEDIFF(HOUR,select [DateOfChange] from statusLog,Users where idstatus=[OldStatus] 
     ,select [DateOfChange] from statusLog,Users where idstatus=[NewStatus])   
     ,(select title from StatusList where idStatus=[OldStatus]) as [OldStatus] 
     ,(select title from StatusList where idStatus=[NewStatus]) as [NewStatus] 
    FROM [statusLog] , Users where 
    statusLog.IdUser=Users.IdUser 

但這並不奏效。我已經加入

兩個表是:

用戶:

enter image description here

statusLog:

enter image description here

請幫助我。

在上述查詢中,我如何在這種時間差異?

編輯:

SELECT  
MemberId, 
     FirstName,LastName, 
     [DateOfChange]  , 

     (SELECT 

    DATEDIFF(HOUR, SL.DateOfChange, SLN.StatusTo) AS StatusDuration 
FROM 
    StatusLog SL 
    OUTER APPLY (
     SELECT TOP(1) 
      DateOfChange AS StatusTo 
     FROM 
      StatusLog SLT 
     WHERE 
      SL.IdUser = SLT.IdUser 
      AND SLT.DateOfChange > SL.DateOfChange 
     ORDER BY 
      SLT.DateOfChange ASC 
    ) SLN) Hourss 

     ,(select title from StatusList where idStatus=[OldStatus]) as [OldStatus] 
     ,(select title from StatusList where idStatus=[NewStatus]) as [NewStatus] 
    FROM [statusLog] , Users where 
    statusLog.IdUser=Users.IdUser 

編輯2:

enter image description here

回答

1

下面是一個SQL查詢只需使用一個子選擇返回所需的結果:

SELECT [users].MemberId, 
    [users].FirstName, 
    [users].LastName, 
    thisLog.DateOfChange, 
    statusList1.title as OldStatus, 
    statuslist2.title as NewStatus, 
    (SELECT TOP 1 DATEDIFF(hour,lastLog.DateOfChange,thisLog.DateOfChange) 
    from [dbo].[statusLog] lastLog WHERE lastLog.DateOfChange<thisLog.DateOfChange 
    ORDER BY DateOfChange desc) AS HoursSinceLastChange 
    FROM [dbo].[statusLog] thisLog 
    INNER JOIN [users] ON [users].IdUser=thisLog.IdUSer 
    INNER JOIN StatusList statusList1 ON statusList1.idStatus=thisLog.OldStatus 
    INNER JOIN StatusList statusList2 on statusList2.idStatus=thisLog.Newstatus 
    order by DateOfChange desc 

希望我得到了所有的列名和表名是正確的。

+0

它顯示我錯誤的值 –

+0

我做了一個編輯7分鐘前,在子選擇中添加一個順序。改變之後你有沒有嘗試過? –

+0

是的,我做到了,在編輯2中得到的結果如上,但是它的錯誤差異在 –

1

啓動這一個(你必須加入的用戶,你想要什麼)

SELECT 
    SL.DateOfChange AS StatusFrom 
    , SLN.StatusTo AS 
    , DATEDIFF(HOUR, SL.DateOfChange, SLN.StatusTo) AS StatusDuration 
FROM 
    StatusLog SL 
    OUTER APPLY (
     SELECT TOP(1) 
      DateOfChange AS StatusTo 
     FROM 
      StatusLog SLT 
     WHERE 
      SL.IdUser = SLT.IdUser 
      AND SLT.DateOfChange > SL.DateOfChange 
     ORDER BY 
      SLT.DateOfChange ASC 
    ) SLN 
    INNER JOIN Users U 
     ON SL.IdUser = U.IdUser 
    INNER JOIN StatusList SLO -- Old status 
     ON SL.OldStatus = SLO.idStatus 
    INNER JOIN StatusList SLC -- Current status 
     ON SL.NewStatus = SLC.idStatus 

APPLY運算符允許您爲查詢的外部表格表達式返回的每一行調用表值函數。表值函數充當正確的輸入,而外部表格表達式充當左邊的輸入。對於左輸入的每一行評估正確的輸入,並將生成的行組合爲最終輸出。 APPLY運算符生成的列列表是左輸入中的一組列,後跟右輸入返回的列列表。 From MSDN: Using APPLY

作爲一個方面說明:表值函數可能是一個子查詢了。

我建議你使用顯式連接語法(INNER JOIN)而不是隱式連接(列出表格並使用WHERE條件)。

+0

你的查詢工作正常,當我單獨運行它,但是當我試圖容納它在我上面的查詢然後它給了我錯誤... subqury返回多個列......當我包容一個差異列從查詢中只有... PLZ看到編輯部分 –

+0

只需添加 INNER JOIN用戶ü ON SL.IdUser = U.IdUser INNER JOIN StatusList SLO - 舊狀態 ON SL.OldStatus = SLO.idStatus INNER JOIN StatusList SLC - 當前狀態 ON SL.NewStatus = SLC.idStatus 到查詢結束。 – Pred

+0

另請注意,如果您想知道最後一個狀態和當前狀態之間的時間,只需更改順序方向並調整第二個狀態。 (SLT.DateOfChange Pred

0

當我遇到這個問題時,我插入了一個臨時表。這可以讓你做很多很酷的事情。

declare @tab TABLE([Date1] TIME, [DATE2] TIME) 

Insert @tab(SELECT DATE1 ,DATE2 FROM WHEREVER) 

SELECT (DATEDIFF(DATE1,DATE2) AS Difference FROM @tab