【问题标题】:Round minutes to hours and quarters of hours (SQL)将分钟舍入到小时和刻钟 (SQL)
【发布时间】:2020-05-14 08:46:50
【问题描述】:

我总共有几分钟,我正在尝试将这些分钟转换为几小时和几刻钟,例如:

513 minutes / 60 = 8.55 -> so would be 8.3 hours
485 minutes / 60 = 8.083 -> 8 hours

如何使用 SQL 来做到这一点?

我一直在搜索,我发现的是这个,但对我不起作用:

@mins 是我存储分钟的变量。

set @mins = dateadd(minute, datediff(minute,0,@mins) / 15 * 15, 0)

【问题讨论】:

  • 您使用的是哪个 dbms?
  • @jarlh Microsoft SQL Server Management Studio
  • 我不明白你的第一个例子,0.55小时不是只有2个季度吗?
  • 这感觉就像一个真的奇怪的要求,并且可能是XY problem的开始。
  • 提示:“对我不起作用”的解释并不是一个特别具体的问题描述。也许它与您战略性地省略的@mins 的数据类型有关。

标签: sql sql-server database tsql date


【解决方案1】:

假设您的时间不能超过 24 小时,您可以执行以下操作:

SELECT CONCAT(DATEPART(HOUR,T.[Time]),'.',DATEPART(MINUTE,T.[Time]) /10)
FROM (VALUES(513),(485),(107))V(YourColumn)
     CROSS APPLY(VALUES(DATEADD(MINUTE, YourColumn, CONVERT(time(0),'00:00')))) T([Time]);

但是,就像我在问题下的评论中提到的那样,这感觉就像是 XY problem 的开始。

【讨论】:

    【解决方案2】:

    这似乎可以满足您的要求,四舍五入到最接近的 15 分钟,然后将其视为“十进制”小时:

    select mins / 60 + (((mins % 60)) / 15) * 0.15
    from (values (513), (485)) v(mins)
    

    8.3 被解释为 8.3 小时(即 498 分钟)时,使用数字表示分钟确实会产生误导,并且可能会导致下游错误。

    我强烈建议您将该值表示为正确的time 值。您可以使用以下方法生成:

    timefromparts(mins / 60, (((mins % 60)) / 15) * 15, 0, 0, 0)
    

    Here 是一个 dbfiddle。

    【讨论】:

      【解决方案3】:
      DECLARE @MinutesTotal   int
      DECLARE @QuatersTotal   int
      DECLARE @HoursOut       int
      DECLARE @QuatersOut     numeric(10,2)
      
      SET @MinutesTotal   =   
                      --      513 --  8:30 
                      --      485 --  8:00 
                              166 --  2:45    
      
      SET @QuatersTotal   =   @MinutesTotal / 15                          
      SET @HoursOut       =   @QuatersTotal /  4                          
      SET @QuatersOut     =   (@QuatersTotal - (@HoursOut * 4)) * 15
      
      
      
      DECLARE @ResultTime time = '00:00'
      
      SET     @ResultTime = DATEADD(HOUR  , @HoursOut     , @ResultTime)
      SET     @ResultTime = DATEADD(MINUTE, @QuatersOut   , @ResultTime)
      
      SELECT  
              @ResultTime 
          ,   ResultAsString  =   CONVERT(varchar(5), @ResultTime )
          ,   ResultAsDecimal =   @HoursOut + (@QuatersOut / 100)
      

      【讨论】:

        【解决方案4】:

        我认为你想要这个算术:

        select @min / 60 + @min % 60 / 100.0
        

        这会为您提供整数形式的小时数,然后是小数部分的剩余分钟数,因此对于您的示例数据,这将分别产生 8.338.05

        另一方面,如果你想让小数部分代表小时数,那么:

        select @min / 60 + @min % 60 / 15 / 10.0
        

        这会产生8.28.0

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-29
          • 2021-07-10
          • 2011-07-04
          • 1970-01-01
          • 1970-01-01
          • 2021-12-29
          • 2012-03-05
          相关资源
          最近更新 更多