我有一张结果表:
C_EventTime L_TID
20130228162022 27200
20130228162059 27200
我如何计算两者之间的秒数差异? 最后,我需要计算所有差异,以计算当月的总数。
我试过了:
declare @startdt '20130228162022'
declare @enddt '20140101000001'
set @startdt = cast('20130101000001' as datetime)
set @enddt = cast('20140101000001' as datetime)
SELECT DATEDIFF(C_EventTime) FROM tTerminalStateLog
WHERE C_EventTime BETWEEN @startDate and @endDate
and L_TID = 27200
但怀疑我有限的SQL知识我离开了!任何帮助赞赏。 TX
答案 0 :(得分:0)
您正在使用的字符串,不能很好地转换为有效的日期时间格式。
首先,DATEDIFF()
需要3个参数。返回值,可以是秒,天等。然后是开始/结束日期。前DATEDIFF(SS,startdate,enddate)
Doc。
以下是有关如何将两个开始/结束值转换为日期时间并计算它们之间差异的示例。
declare @startdt datetime
declare @enddt datetime
select @startdt =
Convert(time,Dateadd(SECOND,
Right('20130228162022',2)/1,
Dateadd(MINUTE,
Right('20130228162022',4)/100,
Dateadd(hour,
Right('20130228162022',6)/10000,
'1900-01-01')))) +
convert(datetime,LEFT('20130228162022',8))
select @enddt =
Convert(time,Dateadd(SECOND,
Right('20140101000001',2)/1,
Dateadd(MINUTE,
Right('20140101000001',4)/100,
Dateadd(hour,
Right('20140101000001',6)/10000,
'1900-01-01')))) +
convert(datetime,LEFT('20140101000001',8))
select @startdt, @enddt
select DATEDIFF(ss, @startdt, @enddt)
但是,您的表显示了拆分为单独行的值...这使得它稍微复杂一些。
假设每个L_Tid有2个结果(没有更多,或者这不会起作用)并且你总是希望比较最早到最新的日期(他们永远不会倒退),你可以做这样:
declare @tTerminalStateLog table (C_EventTime varchar(15), L_Tid INT)
insert into @tTerminalStateLog
select '20130228162022',27200 union all
select '20130228162059',27200
declare @startdt varchar(15), @enddt varchar(15)
set @startdt = '20130228162022'
set @enddt = '20140101000001'
; with datesdata as
(
SELECT Convert(time,Dateadd(SECOND,
Right(C_EventTime,2)/1,
Dateadd(MINUTE,
Right(C_EventTime,4)/100,
Dateadd(hour,
Right(C_EventTime,6)/10000,
'1900-01-01')))) +
convert(datetime,LEFT(C_EventTime,8)) myDate,
L_Tid,
ROW_NUMBER() over(order by C_EventTime) as myID
FROM @tTerminalStateLog
WHERE C_EventTime BETWEEN @startdt and @enddt
and L_Tid=27200
)
select d1.myDate, d2.myDate, DATEDIFF(ss, d1.myDate, d2.myDate) [sec_diff]
from datesdata d1
left outer join datesdata d2
on d1.L_Tid=d2.L_Tid
and d2.myID=2
where d1.myID=1