2012-09-27 142 views
-5

將varchar轉換總和的時間我寫的存儲過程,這樣如何使用SQL Server 2008

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小時。

+3

你怎麼33.90?是一個十進制字段? –

+0

varchar字段Declare @sum varchar(50) – hmk

+0

什麼是WorkingHours數據類型? –

回答

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 
+0

這實際上並沒有解決從表中hour.minute值的總和。看到我的答案 – RichardTheKiwi

0

你可能要重新考慮你的方法,因爲它是一個演示問題,而不是數據庫的問題。

+0

如何處理問題請給我例 – hmk

0

你沒有提到你的字段類型,似乎總和本身不正確,因爲你應該60分鐘基部不100分鐘基本累加領域的小數部分,我認爲這總和將返回錯誤的答案爲你。

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小時,分鐘格式的功能。我剛纔已經包含在查詢本身

2

你帶來的傷害的世界與儲存倍小數。我看到它的方式,你的時間以十進制形式存儲,因此1小時30分鐘進入1.3,對嗎?

你希望33.90轉向34.30,由於0.90意味着90分鐘,但是,你有沒有考慮超出了些許問題,存儲格式collossal失敗?考慮這種情況:

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