【问题标题】:Convert decimal time to hours and minutes将十进制时间转换为小时和分钟
【发布时间】:2013-07-22 13:00:03
【问题描述】:

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

我需要将数据类型为浮点数的时间转换为小时和分钟。所以 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。 如果有人能指出我正确的方向,将不胜感激。

【问题讨论】:

  • 你可以检查这个Answer它肯定会工作

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


【解决方案1】:

你可以试试:

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

输出:20:33:35

但请记住:在 MSSQL 中键入时间只能在 24 小时以内

如果您想要超过 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

【讨论】:

    【解决方案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)))
    

    【讨论】:

    • 当使用字段名称 fdsViewTimesheet.perStandardHours 时这将如何工作? 13.50 只是 fdsViewTimesheet.perStandardHours 字段中数据的一个示例
    • 只需将 @f 替换为 fdsViewTimesheet.perStandardHours - 工作完成:)
    • SQL 中的“13.50”是@f 格式的示例吗?那么我会用 fdsViewTimesheet.perStandardHours 替换所有 @f 示例并保留 13.50 吗?谢谢
    • 只是DATEADD(mi, (fdsViewTimesheet.perStandardHours - FLOOR(fdsViewTimesheet.perStandardHours)) * 60, DATEADD(hh, FLOOR(fdsViewTimesheet.perStandardHours), CAST ('00:00:00' AS TIME)))
    • 谢谢。已尝试但无法获得更高的价值。我有一个 37.5 的字段,并且正在转换为 13.30?适用于较低的值。我的一些字段是实际时间值,但其他字段是小时数和分钟数。即一周工作时间为 37.50。
    【解决方案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,请小心。

    【讨论】:

      【解决方案4】:

      您如何转换为分钟并添加到 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))
      

      【讨论】:

      • 转换效果很好,除非我有一个超过 24 小时的字段。 37.5 计算为 13.30?
      • 您不能使用日期时间/时间数据类型来存储超过 24 小时。如果您想了解如何提出自己的公式,请查看这篇文章:sqlteam.com/article/…
      猜你喜欢
      • 2014-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多