11

一直在为此苦苦挣扎,似乎找不到正确的答案,尽管有很多关于转换的提及,但没有任何具体的工作。

我需要将数据类型为浮点数的时间转换为小时和分钟。所以 13.50 为 13.30。数据类型与 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

4 回答 4

9

你可以试试:

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

于 2014-04-01T21:21:41.877 回答
4

这应该适合你

DECLARE @f [real]
SET @f = 13.50

SELECT DATEADD(mi, (@f - FLOOR(@f)) * 60, DATEADD(hh, FLOOR(@f), CAST ('00:00:00' AS TIME)))
于 2013-07-22T13:04:16.880 回答
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,请小心。

于 2013-07-22T13:11:26.397 回答
1

您如何转换为分钟并添加到 00:00 时间,如下所示:

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

如果您只想在带有 Time 的语句中执行此操作:

 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))
于 2013-07-22T13:07:48.693 回答