将小数时间转换为小时和分钟

时间:2013-07-22 13:00:04

标签: sql-server sql-server-2008 tsql time

一直在努力解决这个问题,似乎无法找到正确的答案,尽管有很多提及转换,但没有具体的工作。

我需要将数据类型为float的时间转换为小时和分钟。所以13.50为13.30。数据类型固定为DB中的float,因此无法更改。 DB是SQL Server 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。 如果有人能指出我正确的方向,将不胜感激。

4 个答案:

答案 0 :(得分:7)

您可以尝试:

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

输出:20:33:35

但请记住:只在24小时内输入MSSQL中的时间

如果您想要超过24小时,请尝试:

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);

输出:01:17:54

答案 1 :(得分:3)

这应该对你有用

DECLARE @f [real]
SET @f = 13.50

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

答案 2 :(得分:3)

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,请注意。

答案 3 :(得分: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小时,则sql中的标准日期时间和时间类型无法保存这些值。它们仅限于24小时不等。 您需要做的是将时间表示存储在字符串中,例如:

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