-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

あなたは、時間を小数として保存することで傷ついた世界にいます。私の見方では、あなたの時間は10進数で保存されているので、1時間30分は1.3になりますよね?

.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分なのに!

とにかく、あなたが持っているもので作業するには、これが必要になります。できるだけ早い機会にdb構造を修正してください。

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

これはプレゼンテーションの問題であり、データベースの問題ではないため、アプローチを再検討することをお勧めします。

于 2012-09-27T04:26:19.703 に答える
0

フィールドタイプについては言及していませんが、フィールドの小数部分を100分ベースではなく60分ベースで合計する必要があるため、合計自体が正しくないようです。合計は間違った答えを返すと思います。

于 2012-09-27T04:32:34.510 に答える
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 に答える