【问题标题】:How to convert the Varchar of sum to time using sql server 2008 [closed]如何使用 sql server 2008 将总和的 Varchar 转换为时间 [关闭]
【发布时间】:2012-09-27 04:15:00
【问题描述】:

我是这样写存储过程的

Declare @sum varchar(50)
Set @sum = (select SUM(ct.WorkingHours) 
            from ConsultantTimeSheet ct 
            where ConsultantID = @Consultantid 
              and ct.Status = @status 
              and ct.StartDate = @StartDate 
              and ct.EndDate = @Enddate 
            group by ConsultantID)

现在我得到了像33.90 这样的总和,但我必须显示34.30,如何转换这种格式分钟超过 60 加上小时。

【问题讨论】:

  • 你是怎么得到 33.90 的?那是一个十进制字段吗?
  • varchar 字段声明@sum varchar(50)
  • 什么是 WorkingHours 数据类型?
  • WHY@sum 一个 varchar(50) 变量,如果您打算在其中存储一个数值?应该是decimal - 即使float 也是一个糟糕的选择(舍入错误!)
  • 小数有时效果不佳。请记住,一小时内有 60 分钟,而不是 100 分钟,而且它们并不总是能很好地转换。

标签: sql sql-server sql-server-2008 stored-procedures time


【解决方案1】:

试试这个:

DECLARE @SUM VARCHAR(50)='33.90';

SELECT CAST(CAST(LEFT(@SUM,CHARINDEX('.',@SUM,0)-1) AS INT)+
       CAST(SUBSTRING(@SUM,CHARINDEX('.',@SUM,0)+1,LEN(@SUM)) 
                                    AS INT)/60 AS VARCHAR(10))+'.'+
       CAST(CAST(SUBSTRING(@SUM,CHARINDEX('.',@SUM,0)+1,LEN(@SUM)) 
                                         AS INT)%60 AS VARCHAR(10))

结果

34.30

【讨论】:

  • 这实际上并没有解决表中小时.分钟值的总和。看我的回答
【解决方案2】:

如果将时间存储为小数,您将陷入痛苦的世界。在我看来,你的时间是以十进制形式存储的,因此 1 小时 30 分钟是 1.3,对吗?

由于 0.90 表示 90 分钟,您预计 33.90 会变为 34.30,但是,您是否考虑过存储格式的巨大故障超出了这个小问题?考虑这种情况:

create table ConsultantTimeSheet (WorkingHours decimal(5,2));
insert ConsultantTimeSheet select 1.3;
insert ConsultantTimeSheet select 1.3;
insert ConsultantTimeSheet select 1.3;
insert ConsultantTimeSheet select 1.5;
Declare @sum varchar(50);
Set @sum = (select SUM(ct.WorkingHours)  from ConsultantTimeSheet ct);
select @sum;

--- output
5.40

因为 .40 不高于 60,所以没有转换。但是,真的应该是6小时20分钟!!

无论如何,要使用您所拥有的,您将需要这个。请尽快修复您的数据库结构。

Declare @sum varchar(50);
Set @sum = (select 1.0*floor(RawDecimal)+(RawDecimal-1.0*floor(RawDecimal))*60/100
            from (
            select RawDecimal=sum(1.0*floor(WorkingHours)) + sum(WorkingHours-floor(WorkingHours))/60*100
            from ConsultantTimeSheet ct 
            where ConsultantID = @Consultantid 
              and ct.Status = @status 
              and ct.StartDate = @StartDate 
              and ct.EndDate = @Enddate ) x);
select @sum;

--- output
6.2

【讨论】:

    【解决方案3】:

    您可能需要重新考虑您的方法,因为这是一个演示问题而不是数据库问题。

    【讨论】:

    • 如何处理这个问题请举个例子
    【解决方案4】:

    您没有提及您的字段类型,总和本身似乎不正确,因为您应该以 60 分钟为基数而不是 100 分钟为基数对字段的小数部分求和,我认为总和将返回错误的答案你。

    【讨论】:

      【解决方案5】:

      试试这个

      Select (Hr+MinFraction/60)+((MinFraction%60)/100.00)
      From
      (
          Select Cast(HourMimute AS INT) As Hr,Cast((HourMimute%Cast(HourMimute AS INT)) *100 As 
          Int) As MinFraction
          From
          (
            select SUM(ct.WorkingHours)  As HourMimute 
              from ConsultantTimeSheet ct 
              where ConsultantID = @Consultantid 
                and ct.Status = @status 
                and ct.StartDate = @StartDate 
                and ct.EndDate = @Enddate 
              group by ConsultantID
          ) As tmp1
      
        ) AS tmp2
      

      你可以编写一个函数,将 100 小时分钟格式转换为 60 小时分钟格式。我刚刚包含在查询本身中

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-08
        • 1970-01-01
        • 2010-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-28
        相关资源
        最近更新 更多