计算结果SQL中的时间差

时间:2014-08-22 14:14:33

标签: sql sql-server-2008 datediff

我有一张结果表:

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

1 个答案:

答案 0 :(得分:0)

您正在使用的字符串,不能很好地转换为有效的日期时间格式。

此处的公式可归入http://rdineshkumar.wordpress.com/tag/how-to-convert-yyyymmddhhmmss-to-datetimedatetime-in-sql-server/

首先,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
相关问题