2013-07-21 70 views
-1

我有一個表transaction這樣的:轉換分鐘時:分:秒在SQL

transactID Paydate     DelDate      vtid 
24   2013-05-08 16:53:03.000 2013-05-08 17:00:28.000  8 
25   2013-05-08 16:34:38.000 2013-05-08 17:00:14.000  7 

我寫這樣的查詢獲得的時間差的總和:

select 
    v.Vtype, 
    SUM(DATEDIFF(MI, t.Paydate, t.DelDate)) as sum_min, 
    AVG(CONVERT(NUMERIC(18, 2), DATEDIFF(MI, t.Paydate, t.DelDate))) as avg_min 
from 
    Transaction_tbl t 
left join 
    VType_tbl v on t.vtid = v.vtid 
where 
    t.transactID in (24, 25) 
group by 
    v.Vtype 

我在幾分鐘內獲得適當的輸出:

Vtype   sum_min  avg_min 
----- ----------- --------------------------------------- 
Normal    26   26.000000 
VIP    7   7.000000 

而不是獲得sum_min列mi nutes我想在hh:mm:ss得到輸出。所以我的期望輸出應該是這樣的:

Vtype   sum_min    avg_min 
----- ----------- --------------------------------------- 
Normal   00:26:00   26.000000 
VIP    00:7:00   7.000000 

獲得此我寫這樣的查詢:

SELECT 
    convert(varchar(10), sum(DATEDIFF(hour, t.Paydate, t.DelDate))) + ':' + 
    convert(varchar(10), sum(DATEDIFF(minute, t.Paydate, t.DelDate) % 60)) + ':' + 
    convert(varchar(10), sum(DATEDIFF(SECOND, t.Paydate, t.DelDate) % 60)) AS 'HH:MM:SS' 
FROM 
    Transaction_tbl t 
WHERE 
    t.transactID in (24, 25) 
group by 
    vtid 

但在我的輸出1小時就要額外費用。執行此查詢時,我得到這樣的輸出:

HH:MM:SS 
-------------------------------- 
1:26:36 
1:7:25 

那麼,如何重新編寫我的查詢以獲得正確的結果呢?

+0

'DATEDIFF(HOUR,...)'只長相在幾點鐘因爲'DelDate'有一個小時的'17'和'PayDate'有一個小時的'16',你會得到一個值'1' –

+0

那個答案是錯的嗎? – user2603688

回答

0

marc_s對他的評論是正確的。你需要的是像這個answer這樣的功能。

你可以這樣稱呼它:

SELECT 
    udfTimeSpanFromSeconds(SUM(DATEDIFF(SECOND, t.Paydate, t.DelDate))) AS 'HH:MM:SS' 
FROM 
    Transaction_tbl t 
WHERE 
    t.transactID in (24, 25) 
group by 
    vtid 
0

如果你想在幾分鐘或幾秒鐘轉換爲hh:mm:ss格式,那麼你可以使用這些功能(DATEADD,與style 114 CONVERT和左):

DECLARE @PayDate  DATETIME, 
     @DelDate  DATETIME, 
     @DiffSeconds INT, 
     @DiffMinutes INT; 

SELECT @PayDate='2013-05-08T16:53:03.000', 
     @DelDate='2013-05-08T17:00:28.000', 
     @DiffSeconds=DATEDIFF(SECOND,@PayDate,@DelDate), 
     @DiffMinutes=DATEDIFF(MINUTE,@PayDate,@DelDate); 


SELECT @DiffSeconds AS Diff_Seconds, 
     LEFT(CONVERT(VARCHAR(50),DATEADD(SECOND,@DiffSeconds,0),114),8) AS Diff_From_Seconds, 
     @DiffMinutes AS Diff_Minutes, 
     LEFT(CONVERT(VARCHAR(50),DATEADD(MINUTE,@DiffMinutes,0),114),8) AS Diff_From_Minutes; 

結果:

Diff_Seconds Diff_From_Seconds Diff_Minutes Diff_From_Minutes 
------------ ----------------- ------------ ----------------- 
445   00:07:25   7   00:07:00