我正在使用一台有多台机器写入数据库的数据库,每台机器都由一个名为ControllerID的列标识,例如,一台机器的控制器ID可能为20,其中一台可能是30分机
我想要做的是每台机器获取最后一次读数和现在之间的经过时间。这就是我目前所拥有的:
SELECT TOP (1) controllerID, convert(Datetime,ReaderTime), DATEDIFF(SECOND,dtReading,GETDATE())
FROM ReaderData
WHERE (controllerID = '30') AND (CardID = 'FFFFFFF0 ')
ORDER BY ReaderIndex DESC
这得到了最后一次读数和现在之间的经过时间,但是如果我把AND(controllerID ='另一个ID')显然不会起作用而且OR也不起作用,因为它只是选择最后一个一,我怎样才能做到这一点?
答案 0 :(得分:1)
如果正确理解了你的目标,你需要像
这样的东西select
controllerID,
max(convert(datetime, ReaderTime)),
datediff(ss, max(dtReading), getdate())
from ReaderData
where CardID = 'FFFFFFF0 '
group by controllerID
这将为您提供有关每个ReaderTime
的上一次dtReading
以及与上一次controllerID
之间的差异的信息。
更新:
在旁注中,如果我想比较每个controllerID的最后2条记录,我该怎么办...
好吧,作为“快速而肮脏”的解决方案,你无法做到以下几点:从以前的查询得到结果,外部应用之前的时间间隔记录如下:
select
T.controllerID,
datediff(ss, T.Max_dtReading, T1.Max_dtReading)
from
(
select
controllerID,
max(dtReading) as Max_dtReading
from ReaderData
where CardID = 'FFFFFFF0 '
group by controllerID
) as T
outer apply(
select max(T1.dtReading) as Max_dtReading
from ReaderData as T1
where
T1.CardID = 'FFFFFFF0 '
and T1.controllerID = T.controllerID
and T1.dtReading < T.Max_dtReading
) as T1
答案 1 :(得分:0)
如果你想以我认为的方式使用OR,你需要将()中的OR分组如下。
SELECT TOP (2) controllerID, convert(Datetime,ReaderTime), DATEDIFF(SECOND,dtReading,GETDATE())
FROM ReaderData
WHERE (controllerID = '30' OR controllerID = '31' OR controllerID = '32') AND CardID = 'FFFFFFF0 '
ORDER BY ReaderIndex DESC
GROUP BY ControllerID
答案 2 :(得分:0)
您想使用IN
()?
SELECT TOP (1) controllerID, convert(Datetime,ReaderTime), DATEDIFF(SECOND,dtReading,GETDATE())
FROM ReaderData
WHERE (controllerID in( '30','26')) AND (CardID = 'FFFFFFF0 ')
ORDER BY ReaderIndex DESC