我有一个具有“时间”列的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