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

最佳答案

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


请注意,编号为3的27小时时差误导性的“ 03:00:00”。

Function to format elapsed time in SQL Server

09-10 02:39
查看更多