【问题标题】:How to add floating numbers as hours, and output hours with minutes and seconds如何将浮点数添加为小时,并以分钟和秒输出小时
【发布时间】:2010-10-02 12:23:43
【问题描述】:

我有一个简单的问题,我有时间使用双格式。 IE。 1.20 小时。 2.30 小时。 3.40 小时。

我想将它们添加为小时而不是浮点数,即以 60 为底。 例如

1.20+2.30+3.40=7.30 小时(正确)

1.20+2.30+3.40=6.90(不正确)

我想要在 SQL 和 C# 中都使用它,目前我正在使用双方的自定义函数。 我想知道任何最简单的方法。

如果我以错误的格式存储它,请告诉我如何正确执行此操作, 基本上我将两个日期时间之间的差异作为浮点数。

欢迎所有可能的解决方案。

【问题讨论】:

  • 为什么不发布现有代码?
  • 作为参考,“1.20 hr”是一小时十二分钟。 “1:20:00”是一小时二十分钟。你让它们看起来像普通的以 10 为基数的数字,它们会被这样对待。
  • 为什么在 SQL 中也需要它?当您必须处理无意义的格式时,最好尽快将它们变成合理的格式,而不是保持这种格式。将废话保留在与需要此格式的流程接口的层,以及实际应用程序中的合理数据。

标签: c# sql


【解决方案1】:

我认为没有“快速”(阅读:内置)方式。你必须自己做。

  • 拆分数字:“整数”部分是小时,小数 (x 100) 是分钟
  • 分别添加小时和分钟
  • 从分钟数中获取“整小时”并调整小时数和分钟数
  • 将各部分相加:小时 + 分钟/100

【讨论】:

  • 即我现在正在做什么
【解决方案2】:
double wholeHours = Math.Floor(timeVal);
TimeSpan realTime = new TimeSpan(wholeHours, (timeSpan - wholeHours) * 100 / 60;

您说“sql”,它建议使用 TIME 数据类型,但我猜(因为它最常见于 C#)您的意思是 SQLServer,唉,它直到 2008 年才支持 TIME 数据类型,所以可能不支持可供您使用,在这种情况下,您必须继续使用浮点数,并将其设置为实际小时数

FLOOR(timeVal) + (timeVal - FLOOR(timeVal)) * 100 / 60

【讨论】:

    【解决方案3】:

    这是一种在 SQL 中执行此操作的方法。 ConvertedData 子查询将您的时间格式拆分为分钟和小时。外部查询将它们加在一起,并将它们转换回您的浮点格式:

    select  sum(hours) + sum(minutes) / 60 as TotalHours
    ,       sum(minutes) % 60 as TotalMinutes
    ,       sum(hours) + sum(minutes) / 60 + sum(minutes) % 60.0 / 100 as YourDt
    from    (
            select  cast(YourDt % 1 * 100 as int) as minutes
            ,       cast(YourDt as int) as hours
            from    (
                    select  1.2 as YourDt
                    union all
                    select  2.3
                    union all
                    select  3.4
                    ) SourceData
            ) ConvertedData
    

    打印出来:

    TotalHours  TotalMinutes  YourDt
    7           30            7.300000
    

    【讨论】:

      【解决方案4】:

      如果可能,请尝试将格式更改为更合理的格式。总分钟数或一个字段表示小时和一个字段表示分钟。它会让你的生活更轻松。

      【讨论】:

      • 我不能,因为它不在我手中
      【解决方案5】:

      嗯,一个 .NET 程序集可以被称为 SQL 服务器中的存储过程,因此您的解决方案可以用 C# 编写

      我会使用 TimeSpan 对象进行这种计算,正如 Jon 已经展示的那样,增加了一些舒适度:

      public static TimeSpan AddMinutes(this TimeSpan span, double mins)
      {
        return span.Add(TimeSpan.FromMinutes(mins));
      }
      
      public static string ToHourAndMins(this TimeSpan span)
      {
        return string.Format("{0}:{1:00}", Math.Truncate(span.TotalHours), span.Minutes);
      }
      

      那么你可以这样做:

      var ts = TimeSpan.FromMinutes(20);
      ts = ts.AddMinutes(45);
      Console.WriteLine(ts.ToHourAndMins());
      

      【讨论】:

        【解决方案6】:

        以您的方式计算日期时间确实是个坏主意。这是你想要的:

            double original = 1.55d+2.9d+3.48d;
            double carry = (int)(original * 100) % 100 / 60;
            double result = original + carry - carry / 100 * 60;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-26
          • 1970-01-01
          • 2014-10-01
          相关资源
          最近更新 更多