2015-06-10 21 views
7

我的表中有一列。我們在其中存儲字符串值格式'HH:MM' .During取記錄與此表中的每一件事工程確定與如何處理DATEDIFF(MINUTE,'00:00','24:20')像情景一樣?

DATEDIFF(MINUTE, '00:00', ColumnName) 

問題是,當我們的價值比23:59更大。 其顯示錯誤,如

轉換日期和/或時間從字符串轉換失敗。

有人可以建議我實現這種情況的正確方法。

+2

正確的做法是使用適當的數據類型。 –

+0

你使用哪種rdbms? – ughai

+0

實際上,我們必須保存大於'23:59'的值,以便我們將數據類型作爲Varchar。 –

回答

2

所以,它聽起來就像你節省了時間週期的長度。嘗試在幾分鐘內存儲它。我的查詢可以處理不同長度的數字,因爲它基於冒號。

DECLARE @yourTable TABLE (ColumnName VARCHAR(10)); 
INSERT INTO @yourTable 
VALUES ('100:00'), 
     ('24:20'); 

SELECT ColumnName, 
     (hr * 60) + minut AS time_period_in_minutes 
FROM @yourTable 
CROSS APPLY (SELECT CAST(SUBSTRING(ColumnName,0,CHARINDEX(':',ColumnName)) AS INT), 
        CAST(SUBSTRING(ColumnName,CHARINDEX(':',ColumnName) + 1,LEN(ColumnName)) AS INT)) CA(hr,minut) 

結果:

ColumnName time_period_in_minutes 
---------- ---------------------- 
100:00  6000 
24:20  1460 
+1

感謝它適合我。 –

0

嘗試將此

select DATEDIFF(MINUTE, '00:00', case when ISDATE(ColumnName)=0 then '00:00' else ColumnName end) 
5

如果要存儲的值大於時間以外的東西,爲什麼不只是存儲的分鐘數和任何格式你想在輸出轉換爲?

否則,我會建議你只需將值轉換爲分鐘:如果你不使用的日期/時間值

select (cast(left(ColumnName, 2) as int) * 60 + 
     cast(right(ColumnName, 2) as int) 
     ) as Minutes 

,存在一種使用爲他們設計的功能專門沒有要求。

編輯:

爲了處理時間比99長,使用charindex()

select (cast(left(ColumnName, charindex(':', ColumnName) - 1) as int) * 60 + 
     cast(right(ColumnName, 2) as int) 
     ) as Minutes 
+0

它被失敗的情況下,當我們有「100:00」。。。像值 –

+0

@AshishBisht見編輯它現在應該工作 –

相關問題