2012-09-27 2 views
-5

를 사용하여 시간에 합의 대 Varchar를 변환하는 방법을 내가 33.90 같은 금액을 가지고 지금이는 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) 

같은 저장 프로 시저를 작성,하지만 난 어떻게 그렇게 변환하는 34.30를 표시해야 형식 분은 60 시간을 초과합니다.

+3

어떻게 33.90을 얻습니까? 10 진수 필드입니까? –

+0

varchar 필드 @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

문제 처리 방법 pls 예 – hmk

0

필드 유형을 언급하지 않았으므로 100 분 기본이 아닌 60 분 기본으로 필드의 소수 부분을 합산해야하므로 합계 자체가 올바르지 않은 것으로 보입니다. 그 합계가 잘못된 답을 반환한다고 생각합니다. 너를 위해서.

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 

더 나은 당신이 60 시간 분 형식으로 100 시간 분 포맷을 변환하는 함수를 작성할 수보십시오. 난 그냥 그 자체

2

당신은 소수로 시간을 저장과 상처의 세계에 대한에있어. 내가 본 방식대로, 당신의 시간은 10 진수 형식으로 저장되므로 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 분이어야한다!!

어쨌든, 가지고있는 것을 사용하려면이 기능이 필요합니다. 최대한 빨리 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