2013-07-22 210 views
7

一直在努力解決這個問題,似乎無法找到正確的答案,雖然有很多轉換的提及,但沒有具體的工作。將小數點轉換爲小時和分鐘

我需要將數據類型爲float的時間轉換爲小時和分鐘。 13.30爲13.30。在數據庫中固定爲float的數據類型不能更改。 DB是SQL服務器2008R2

曾嘗試:

cast(cast(floor(fdsViewTimesheet.perStandardHours) as  
float(2))+':'+cast(floor(100*( 
fdsViewTimesheet.perStandardHours - floor(fdsViewTimesheet.perStandardHours)))as 
float(2)) as time) AS STANDARD_HOURS 

,但我得到有錯誤消息"Explicit conversion from data type real to time is not allowed"試圖as char而不是as float但查詢掛起。

我在做什麼錯?我只是want to convert a float value into hours and minutes。 如果有人能指出我的方向是正確的,我將不勝感激。

回答

2

這應該爲你

DECLARE @f [real] 
SET @f = 13.50 

SELECT DATEADD(mi, (@f - FLOOR(@f)) * 60, DATEADD(hh, FLOOR(@f), CAST ('00:00:00' AS TIME))) 
+0

將如何使用字段名fdsViewTimesheet.perStandardHours當這項工作? 13.50只是fdsViewTimesheet.perStandardHours中的數據示例 – user1022772

+0

只需將f替換爲fdsViewTimesheet即可。perStandardHours - 完成任務:) –

+0

SQL中的'13.50'是@f格式的示例嗎?那麼我會用fdsViewTimesheet.perStandardHours替換@f的所有示例並保留13.50?謝謝 – user1022772

1

工作,你怎麼樣轉變爲分鐘,並加入到00:00的時間,像這樣:

DECLARE @c datetime 
select @c = dateadd(mi,fdsViewTimesheet.perStandardHours*60,'00:00') 

如果你想做到這一點與聲明僅限時間:

select CONVERT(TIME,dateadd(mi,fdsViewTimesheet.perStandardHours*60,'00:00') ) 

如果您的值大於24小時,則標準日期時間和時間ty在SQL中的PES不能容納這些。他們僅限於持有24小時範圍。 什麼,你需要做的是時間表示在一個字符串存儲例如像這樣:

select cast(floor(fdsViewTimesheet.perStandardHours) as varchar(10)) + ':' + cast(FLOOR((fdsViewTimesheet.perStandardHours - floor(fdsViewTimesheet.perStandardHours))*60)as varchar(2)) 
+0

轉換工作很好,除非我有超過24小時的領域。 37.5計算爲13.30? – user1022772

+1

您不能使用日期時間/時間數據類型來存儲24小時以上的數據。如果您想了解如何提出自己的公式,請查看本文:http://www.sqlteam.com/article/working -with-時間跨度,和持續時間,在-SQL服務器 –

2
DECLARE @f FLOAT = 13.5; 

SELECT CONVERT(TIME(0), DATEADD(MINUTE, 60*@f, 0)); 

或者,如果你只是想hh:mm作爲一個字符串:

SELECT CONVERT(CHAR(5), DATEADD(MINUTE, 60*@f, 0), 108); 

只是要小心如果您的值> = 24。

4

您可以嘗試:

DECLARE @HOURS decimal(7,4) = 20.5599 
SELECT CAST(CONVERT(VARCHAR,DATEADD(SECOND, @HOURS * 3600, 0),108) AS TIME) 

輸出:20點33分35秒

但要記住:只有在24小時

如果你想超過24小時較大型時間MSSQL,嘗試:

DECLARE @HOURS decimal(7,4) = 25.5599 
SELECT 
RIGHT('0' + CAST (FLOOR(@HOURS) AS VARCHAR), 2) + ':' + 
RIGHT('0' + CAST(FLOOR((((@HOURS * 3600) % 3600)/60)) AS VARCHAR), 2) + ':' + 
RIGHT('0' + CAST (FLOOR((@HOURS * 3600) % 60) AS VARCHAR), 2) 

輸出:25:33: 35

- 更新

十進制分鐘,超過24小時

DECLARE @MINUTES decimal(7,4) = 77.9 
SELECT 
RIGHT('0' + CAST (FLOOR(COALESCE (@MINUTES, 0)/60) AS VARCHAR (8)), 2) + ':' + 
RIGHT('0' + CAST (FLOOR(COALESCE (@MINUTES, 0) % 60) AS VARCHAR (2)), 2) + ':' + 
RIGHT('0' + CAST (FLOOR((@MINUTES* 60) % 60) AS VARCHAR (2)), 2); 

輸出:1點17分54秒

相關問題