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)
以这样的方式选择值
此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".
小智 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
根据需要格式化结果。
归档时间: |
|
查看次数: |
90000 次 |
最近记录: |