一直在努力解决这个问题,似乎无法找到正确的答案,尽管有很多提及转换,但没有具体的工作。
我需要将数据类型为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
。
如果有人能指出我正确的方向,将不胜感激。
答案 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))