我有一个包含终端连接日志的表。从该表中可以看到'EventTime','TerminalID'和'Detail'列。
我当前的查询如下所示:
select
C_EventTime, L_TID,
CASE L_Detail
when '11' then 'Terminal Disconnected'
when '12' then 'Terminal Connected'
END as 'Detail'
from
dbo.tTerminalStateLog
where
L_Detail in (11,12) and C_EventTime >= '20140310000000'
order by
L_TID, C_EventTime
输出如下:
C_EventTime L_TID Detail
----------------------------------------------
20140310110637 5000 Terminal Connected
20140312142909 5000 Terminal Disconnected
20140313173850 5000 Terminal Connected
20140313233512 5000 Terminal Disconnected
20140313233610 5000 Terminal Connected
20140310013506 5001 Terminal Disconnected
20140310013517 5001 Terminal Connected
20140310222519 5001 Terminal Disconnected
20140310222532 5001 Terminal Connected
20140312165526 5001 Terminal Disconnected
20140312165536 5001 Terminal Connected
20140310121415 12300 Terminal Connected
20140310122031 12300 Terminal Disconnected
20140311083532 12300 Terminal Connected
20140311084218 12300 Terminal Disconnected
20140311085141 12300 Terminal Connected
20140311085212 12300 Terminal Disconnected
20140322115023 13100 Terminal Disconnected
20140322115543 13100 Terminal Connected
20140322142655 13100 Terminal Disconnected
20140322144834 13100 Terminal Connected
20140327192448 13100 Terminal Disconnected
我想计算每个Disconnected和Connected终端状态之间的持续时间,计算每个L_TID上的每个离线连接持续时间,并给出Rows = TerminalID和Columns 24hrs,168hrs(星期)和720hrs(月)的输出。
我应该首先通过以下方式将varchar分解为更易读的格式:
DECLARE @x VARCHAR(14)
SET @x = '20040102102425'
SELECT @x,
STUFF(STUFF(STUFF(@x, 9, 0, ' '), 12, 0, ':'), 15, 0, ':'),
CAST(STUFF(STUFF(STUFF(@x, 9, 0, ' '), 12, 0, ':'), 15, 0, ':') AS DATETIME)
输出:
(No column name) (No column name) (No column name)
20040102102425 20040102 10:24:25 2004-01-02 10:24:25.000
然后在运行后计算datetime connection_states以获取总时间值:
select datediff(ss, '2010-01-22 15:29:55' , '2010-01-22 15:30:09')
如何运行以查看每个终端ID的完全断开连接状态?
我想到的例子:
L_TID 24 hrs 1 Week 30 days
-----------------------------------------------------------------------
5000 00:42:24 04:21:07 16:49:46
5001 00:09:38 01:38:01 05:32:19
123000 01:05:59 09:29:15 11:58:19
希望有人可以提供建议。
答案 0 :(得分:0)
如果是Oracle,那么你可以试试像
这样的东西SELECT l_tid,
c_eventtime - Lag(c_eventtime, 2, Trunc(c_eventtime))
over (
ORDER BY c_eventtime) AS PriorRowEventTime,
details
FROM (SELECT l_tid,
To_date(c_eventtime, 'YYYYMMDDHH24MISS') c_eventtime,
details
FROM table1);