-5

我写了这样的存储过程

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 加到小时。

4

5 回答 5

2

尝试这个:

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
于 2012-09-27T05:06:10.573 回答
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
于 2012-09-27T05:27:59.147 回答
0

尝试这个

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 小时分钟格式的函数。我刚刚包含在查询本身中

于 2012-09-27T04:42:27.057 回答
0

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

于 2012-09-27T04:32:34.510 回答
0

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

于 2012-09-27T04:26:19.703 回答