2013-07-22 2 views
3

integervarchar으로 변환하는 데 도움이 필요합니다.SQL int를 varchar로 변환

ProfileIDCurrenttime을 사용하는 절차를 작성하려고합니다. 이 두 값을 사용하여 profileID의 시작 시간을 찾고 을 starttime에서 뺀 다음 hours:minutes:seconds을 반환합니다.

내가 뭘 잘못하고 있는데, 더 좋은 방법이 있나요?

감사합니다.

CREATE PROCEDURE [dbo].[CalculateElaspedTime] 
    -- Add the parameters for the stored procedure here 
    @ProfileID nvarchar(10), 
    @CurrentDateTime datetime = '' 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 
    if @CurrentDateTime = CAST('' as datetime) 
    set @CurrentDateTime = GETDATE() 

    DECLARE @StartTime datetime; 
    DECLARE @ElaspedTime time; 
    DECLARE @hh int; 
    DECLARE @mm int; 
    DECLARE @ss int; 
    Declare @TimeString varchar 
    set @StartTime = (Select top 1 [DateTime] From Log WHERE ProfileID = @ProfileID); 
    set @hh = DateDiff(hour,@StartTime,@CurrentDateTime); 
    set @mm = DateDiff(minute,@StartTime,@CurrentDateTime)-60*@hh; 
    set @ss = DateDiff(second,@StartTime,@CurrentDateTime)-60*@mm; 

    set @TimeString = (Select CAST(@hh as varchar)); -- Fails Here 
    set @ElaspedTime = convert(datetime, cast(@hh as varchar) + ':' + cast(@mm as varchar) + ':' + cast(@ss as varchar)); 
    INSERT INTO Log (ElaspedTime) Values (@ElaspedTime); 
END 
+0

오류 메시지가 무엇 –

+0

@hh의 값은 무엇 오류가 발생하는 시점에서? ElideTime에 대한 논리는 간격을 언급하지 않고 있음을 나타냅니다. –

+0

@hh = 1의 값입니다. C 날짜 및/또는 시간을 문자열에서 변환 할 때 변환이 실패했습니다. – Pat

답변

8

시도해보십시오. 기능에있는 그 흥분 전부는 불필요 할지도 모른다. SQL은 명시 적으로 ORDER BY 절에 지정하지 않으면 결과 순서에 대해 보증하지 않습니다으로

set @StartTime = (Select top 1 [DateTime] From Log WHERE ProfileID = @ProfileID); 

그것의 결과가 불확정 있습니다 : 당신이

CONVERT(varchar(10),(@[email protected]_Time),108) 
+3

변환 할 때 ** varchar를 ** 항상 ** 길이 **로 지정해야합니다. 길이를 생략하면 기본값이 무엇인지 알 수 있습니까? –

+1

매우 사실. 포인터 고마워. –

1

하나의 문제는이 문입니다. ORDER BY를 사용하거나 MAX()와 같은 집계 함수를 사용하여 원하는 행을 가져와야합니다.

그리고 너는 필요한 것보다 훨씬 많은 일을하고있다. SQL Server (최신 버전, 어쨌든)는 날짜 계산을 지원하며 두 날짜를 뺀 날짜가 다른 날짜입니다 (1900 년 1 월 1 일 00 : 00 : 00.000의 SQL Server 신기원에서 상쇄 됨).이 단순한 형식은 경과하지 않으면 시간이 일일 초과하게됩니다 : 당신의 경과 시간은 일일 초과 할 경우

create procedure dbo.CalculateElaspedTime 

    @ProfileID  nvarchar(10) , 
    @CurrentDateTime datetime = '' 

as 

    set nocount on 

    declare 
    @now  dateTime , 
    @start datetime , 
    @elapsed varchar(32) 

    select @now = case coalesce(@currentDateTime,'') when '' then current_timestamp else @currentDateTime end , 
     @start = max([DateTime]) 
    from dbo.Log 
    where ProfileId = @profileId 

    set @elapsed = convert(varchar,@[email protected],108) 

    insert dbo.Log (ElapsedTime) Values (@elapsed); 

    return 0 
go 

를, 다음 원래의 접근 방식은 당신이 원하는 무엇인가?

create procedure dbo.CalculateElaspedTime 

    @ProfileID  nvarchar(10) , 
    @CurrentDateTime datetime = '' 

as 

    set nocount on 

    declare @now  dateTime = case coalesce(@currentDateTime,'') when '' then current_timestamp else @currentDateTime end , 
    declare @start datetime = (select max([DateTime]) from dbo.Log where profileId = @profileId) 
    declare @elapsed int  = select datediff(ss,@now,@start) 
    declare 
    @hh int , 
    @mm int , 
    @ss int 

    set @hh  = @elapsed/3600 -- 3600 is seconds/hour 
    set @elapsed = @elapsed % 3600 
    set @mm  = @elapsed/60 -- 60 is seconds/minute 
    set @elapsed = @elapsed % 60 
    set @ss  = @elapsed/1 -- 1 is seconds/second :) 

    declare @hhmmss =  right('00'+convert(varchar,@hh),2) 
        + ':' + right('00'+convert(varchar,@mm),2) 
        + ':' + right('00'+convert(varchar,@ss),2) 

    insert dbo.Log (ElapsedTime) Values (@hhmmss); 

    return 0 
go