2010-09-15 123 views
3

我有一個數據庫,它將時間顯示爲一個整數。不過,我想將其輸出到正確格式的報告中。這是我想要更改的格式:SQL將int轉換爲時間

例如。

183000將成爲18:30 500將成爲00:05 160000將成爲16:00

等。

我看了一下,CAST和CONVERT,但沒有成功設法以正確的格式得到這個時間。

回答

3

假設你的投入將永遠是一個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等)

3

看起來你需要除以100得到秒數,除以10000得到分鐘數,再除以1000000得到小時數,然後將這些值格式化爲一個字符串,在小時和分鐘之間插入一個冒號,像

HH:MM

+0

+1對於沒有字符串解析(這可能是我會做的) – 2010-09-15 16:49:13

2

首先要轉換成varchar字段和所有時間轉換爲4位加前導零如果需要的話(500會成爲0500),然後分手的場concantenation左(myfield,2)+':'+ right(myfield,2)

這是每次運行報告都很愚蠢的做法,這會浪費服務器資源。如果可能的話,將字段更改爲varchar並將代碼運行一次。如果不行的話,你可以添加一個格式化的字段,並有一個觸發器在插入時進行形成(你仍然需要第一次更新字段?可能約束會代替觸發器,但這取決於數據庫。

1

我假設你是在基於使用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