SQL Server - 计算 HH:MM:SS 格式的两个日期时间戳之间的经过时间

问题描述 投票:0回答:9

我有一个包含“时间”列的 SQL Server 表。该表是一个日志表,其中包含状态消息和每条消息的时间戳。日志表通过批处理文件插入。有一个 ID 列将行分组在一起。每次运行批处理文件时,它都会初始化 ID 并写入记录。我需要做的是获取从 ID 集中的第一条记录到同一 ID 集的最后一条记录所经过的时间。我开始玩弄 select Max(Time) - Min(Time) from logTable where id = 但无法弄清楚如何正确格式化它。我需要 HH:MM:SS。

sql-server-2008 datetime elapsedtime
9个回答
18
投票

SQL Server 不支持 SQL 标准间隔数据类型。最好的办法是以秒为单位计算差异,并使用函数来格式化结果。只要您的间隔小于 24 小时,本机函数 CONVERT() 可能看起来就可以正常工作。但 CONVERT() 并不是一个好的解决方案。

create table test ( id integer not null, ts datetime not null ); insert into test values (1, '2012-01-01 08:00'); insert into test values (1, '2012-01-01 09:00'); insert into test values (1, '2012-01-01 08:30'); insert into test values (2, '2012-01-01 08:30'); insert into test values (2, '2012-01-01 10:30'); insert into test values (2, '2012-01-01 09:00'); insert into test values (3, '2012-01-01 09:00'); insert into test values (3, '2012-01-02 12:00');

选择值的方式使得

    id = 1,经过时间为1小时
  • id = 2,经过的时间为 2 小时,并且
  • id = 3,经过时间为3小时。
此 SELECT 语句包括一列计算秒数,以及一列使用 CONVERT() 进行减法。

select t.id, min(ts) start_time, max(ts) end_time, datediff(second, min(ts),max(ts)) elapsed_sec, convert(varchar, max(ts) - min(ts), 108) do_not_use from test t group by t.id; ID START_TIME END_TIME ELAPSED_SEC DO_NOT_USE 1 January, 01 2012 08:00:00 January, 01 2012 09:00:00 3600 01:00:00 2 January, 01 2012 08:30:00 January, 01 2012 10:30:00 7200 02:00:00 3 January, 01 2012 09:00:00 January, 02 2012 12:00:00 97200 03:00:00

请注意 ID 号 3 上的 27 小时差异的误导性“03:00:00”。

SQL Server 中格式化经过时间的函数


16
投票

更新:

在SQL Server中正确计算一个时间跨度,

即使超过24小时

-- Setup test data declare @minDate datetime = '2012-12-12 20:16:47.160' declare @maxDate datetime = '2012-12-13 15:10:12.050' -- Get timespan in hh:mi:ss select cast( (cast(cast(@maxDate as float) - cast(@minDate as float) as int) * 24) /* hours over 24 */ + datepart(hh, @maxDate - @minDate) /* hours */ as varchar(10)) + ':' + right('0' + cast(datepart(mi, @maxDate - @minDate) as varchar(2)), 2) /* minutes */ + ':' + right('0' + cast(datepart(ss, @maxDate - @minDate) as varchar(2)), 2) /* seconds */ -- Returns 18:53:24

特别欢迎显示不准确的边缘案例!


12
投票
DECLARE @EndTime AS DATETIME, @StartTime AS DATETIME SELECT @StartTime = '2013-03-08 08:00:00', @EndTime = '2013-03-08 08:30:00' SELECT CAST(@EndTime - @StartTime AS TIME)

结果:

00:30:00.0000000



按照您认为合适的方式设置结果格式。


2
投票
最好又简单的方法:

Convert(varchar, {EndTime} - {StartTime}, 108)

就像安里所说的那样。


2
投票
使用 DATEDIFF 返回以毫秒、秒、分钟、小时...为单位的值

DATEDIFF(间隔,日期1,日期2)

interval REQUIRED - 要返回的时间/日期部分。可以是以下值之一:

year, yyyy, yy = Year quarter, qq, q = Quarter month, mm, m = month dayofyear = Day of the year day, dy, y = Day week, ww, wk = Week weekday, dw, w = Weekday hour, hh = hour minute, mi, n = Minute second, ss, s = Second millisecond, ms = Millisecond

date1, date2 REQUIRED - 要计算之间差异的两个日期


1
投票

select convert(varchar, Max(Time) - Min(Time) , 108) from logTable where id=...


    


1
投票
看看这是否有帮助。我可以为经过的天数、小时、分钟、秒设置变量。 您可以根据自己的喜好设置其格式或包含在用户定义的函数中。

注意:不要使用 DateDiff(hh,@Date1,@Date2)。这不可靠!它以不可预测的方式循环

给定两个日期... (日期示例:两天、三小时、10 分钟、30 秒差异)

declare @Date1 datetime = '2013-03-08 08:00:00' declare @Date2 datetime = '2013-03-10 11:10:30' declare @Days decimal declare @Hours decimal declare @Minutes decimal declare @Seconds decimal select @Days = DATEDIFF(ss,@Date1,@Date2)/60/60/24 --Days declare @RemainderDate as datetime = @Date2 - @Days select @Hours = datediff(ss, @Date1, @RemainderDate)/60/60 --Hours set @RemainderDate = @RemainderDate - (@Hours/24.0) select @Minutes = datediff(ss, @Date1, @RemainderDate)/60 --Minutes set @RemainderDate = @RemainderDate - (@Minutes/24.0/60) select @Seconds = DATEDIFF(SS, @Date1, @RemainderDate) select @Days as ElapsedDays, @Hours as ElapsedHours, @Minutes as ElapsedMinutes, @Seconds as ElapsedSeconds
    

0
投票
希望这可以帮助您获得两个时间戳之间的准确时间

Create PROC TimeDurationbetween2times(@iTime as time,@oTime as time) As Begin DECLARE @Dh int, @Dm int, @Ds int ,@Im int, @Om int, @Is int,@Os int SET @Im=DATEPART(MI,@iTime) SET @Om=DATEPART(MI,@oTime) SET @Is=DATEPART(SS,@iTime) SET @Os=DATEPART(SS,@oTime) SET @Dh=DATEDIFF(hh,@iTime,@oTime) SET @Dm = DATEDIFF(mi,@iTime,@oTime) SET @Ds = DATEDIFF(ss,@iTime,@oTime) DECLARE @HH as int, @MI as int, @SS as int if(@Im>@Om) begin SET @Dh=@Dh-1 end if(@Is>@Os) begin SET @Dm=@Dm-1 end SET @HH = @Dh SET @MI = @Dm-(60*@HH) SET @SS = @Ds-(60*@Dm) DECLARE @hrsWkd as varchar(8) SET @hrsWkd = cast(@HH as char(2))+':'+cast(@MI as char(2))+':'+cast(@SS as char(2)) select @hrsWkd as TimeDuration End
    

0
投票
Declare @StartDate DateTime,@EndDate Datetime, @seconds int,@secondsb int, @minutes int, @minutesB int, @Hours int,@hoursB int, @Days int, @Daysb int, @Years int; set @StartDate='2021-01-10 10:12:13.987' set @EndDate=getdate() --You can enter end date in above similar manners or use getdate() to compare current date and time set @Seconds = DATEDIFF(SECOND, @StartDate, @EndDate) set @secondsb=@Seconds%60 set @Minutes=(@Seconds-@SecondsB)/60 set @MinutesB=@Minutes%60 set @Hours=(@Minutes-@MinutesB)/60 set @HoursB=@Hours%24 set @days=(@Hours-@HoursB)/24 set @DaysB=@Days%365 set @Years=(@Days-@DaysB)/365 Select @Years Years, @Daysb Days, @hoursB Hours,@minutesB Minutes, @secondsb Seconds
    
© www.soinside.com 2019 - 2024. All rights reserved.