SQL Konvertierung int zu varchar

Ich brauche Hilfe bei der Umwandlung einer integer in einen varchar .

Ich versuche, eine Prozedur zu schreiben, die eine ProfileID und eine Currenttime . Mit diesen beiden Werten findet er die Startzeit der profileID und subtrahiert die currenttime ab starttime und gibt hours:minutes:seconds .

Was mache ich falsch, gibt es einen besseren path, dies zu schreiben?

Vielen Dank.

 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 

Versuche dies. All diese Aufregung in der function kann unnötig sein.

 CONVERT(varchar(10),(@CurrentDateTime-@Start_Time),108) 

Ein Problem, das Sie haben, ist diese Aussage:

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

Die Ergebnisse sind unbestimmt, da SQL keine Garantien für die Ergebnisreihenfolge gibt, es sei denn, Sie explizit spezifizieren sie in einer ORDER BY-Klausel. Sie sollten ORDER BY verwenden oder eine Aggregatfunktion wie MAX () verwenden, um die gewünschte Zeile zu erhalten.

Und du machst viel mehr Arbeit als nötig SQL server (aktuelle Versionen ohnehin) Unterstützungsdatum Arithmetik, mit dem Ergebnis der Subtraktion von zwei data, die ein anderes date (Offset von der SQL server-Epoche von 1 Jan 1900 00: 00: 00.000. Diese einfachere Form sollte Sie tun, es sei denn, die verstrichenen time wird 1 Tag überschreiten:

 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,@now-@start,108) insert dbo.Log ( ElapsedTime ) Values (@elapsed); return 0 go 

Wenn Ihre verstrichene time einen Tag überschreiten könnte, dann ist Ihr ursprünglicher Ansatz, was Sie wollen:

 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