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

Mik*_*ebb 12 datetime sql-server-2008 elapsedtime

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

Tim*_*ner 14

更新:

正确计算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
Run Code Online (Sandbox Code Playgroud)

显示不准确的边缘情况特别受欢迎!


Mik*_*ll' 10

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');
Run Code Online (Sandbox Code Playgroud)

以这样的方式选择值

  • 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
Run Code Online (Sandbox Code Playgroud)

注意对于身份证号码3的27小时差异的误导性"03:00:00".

用于格式化SQL Server中的已用时间的函数


小智 5

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)
Run Code Online (Sandbox Code Playgroud)

结果: 00:30:00.0000000

根据需要格式化结果。

  • 如果时间超过24小时将失败 (2认同)