我有一個數據庫,它將時間顯示爲一個整數。不過,我想將其輸出到正確格式的報告中。這是我想要更改的格式:SQL將int轉換爲時間
例如。
183000將成爲18:30 500將成爲00:05 160000將成爲16:00
等。
我看了一下,CAST和CONVERT,但沒有成功設法以正確的格式得到這個時間。
我有一個數據庫,它將時間顯示爲一個整數。不過,我想將其輸出到正確格式的報告中。這是我想要更改的格式:SQL將int轉換爲時間
例如。
183000將成爲18:30 500將成爲00:05 160000將成爲16:00
等。
我看了一下,CAST和CONVERT,但沒有成功設法以正確的格式得到這個時間。
假設你的投入將永遠是一個int,你可以像它解析:
DECLARE @stringTime varchar(6)
SET @stringTime = RIGHT('000000' + CAST(intTime AS VARCHAR), 6)
SELECT CAST(LEFT(@stringTime, 2) + ':' + RIGHT(LEFT(@stringTime, 4), 2) AS TIME) as TimeValue
我肯定會看這個字段更改爲實際的時間或日期時間字段,因爲這個級別的不建議轉換,特別是對於大量使用的數據庫。只有真的有一個更好的方式來存儲您的數據。
以這種方式使用一個int值可以允許很多不好的數據,而且不會在輸入上增加很多額外的檢查和/或約束(例如:260000,127900等)
看起來你需要除以100得到秒數,除以10000得到分鐘數,再除以1000000得到小時數,然後將這些值格式化爲一個字符串,在小時和分鐘之間插入一個冒號,像
HH:MM
首先要轉換成varchar字段和所有時間轉換爲4位加前導零如果需要的話(500會成爲0500),然後分手的場concantenation左(myfield,2)+':'+ right(myfield,2)
這是每次運行報告都很愚蠢的做法,這會浪費服務器資源。如果可能的話,將字段更改爲varchar並將代碼運行一次。如果不行的話,你可以添加一個格式化的字段,並有一個觸發器在插入時進行形成(你仍然需要第一次更新字段?可能約束會代替觸發器,但這取決於數據庫。
我假設你是在基於使用CONVERT
和您以前的問題的SQL Server上。
您也可以使用DATEADD
。
WITH Times AS
(
SELECT 183000 AS T
UNION ALL
SELECT 500
UNION ALL
SELECT 160000
)
SELECT CAST(DATEADD(SECOND, T%100 + (60*(T%10000/100)) + 3600*(T/10000),0)
AS time /*Or datetime if < SQL Server 2008*/)
FROM Times
+1對於沒有字符串解析(這可能是我會做的) – 2010-09-15 16:49:13