获取from和date范围之间的活动行,包括边界

时间:2011-06-30 19:31:56

标签: sql database sql-server-2005 tsql stored-procedures

testTable有4列

  • sessionid int
  • started datetime
  • ended datetime
  • SessionIsRunning bool - 如果上次会话尚未结束,则为真。最多只有一条记录可以随时为真,因为最多只有一个会话可以运行。如果没有会话正在运行,那么所有记录都将其设置为false。

如果有两个日期说fromDatetoDate,我该如何获得fromDate之后或之后开始的第一个会话以及toDate之前或之后结束的最后一个会话。棘手的情况是,如果一个会话正在进行中并且它是start date >= fromDate我们需要这个。我猜测可能无法在一个sql语句中同时获取最小和最大会话ID,并保持代码可读且易于维护。两个单独的sql语句是可以的。一个得到最小,一个得到最大。然后我可以在min和max之间使用查询行。

最后一句话以不同的方式解释了它。获取所有已启动或正在运行并已结束或在/至日期之间运行的会话,谢谢

2 个答案:

答案 0 :(得分:2)

在考虑了您对BETWEEN的编辑和评论之后,这应该会为您提供所需的结果集。它将拉取SessionIsRunning = true的任何记录以及在日期范围内开始和结束的会话。

SELECT * FROM testTable tt
WHERE (tt.started >= fromDate AND tt.started < DATEADD(DAY, 1, toDate)
   AND tt.ended >= fromDate AND tt.ended < DATEADD(DAY, 1, toDate))
   OR SessionIsRunning = true
ORDER BY tt.sessionid

答案 1 :(得分:1)

只获取单个查询中的第一个和最后一个值(因为您的问题让我很好奇如何实际写这个,即使这看起来并不像您真正要求的那样):

SELECT * FROM
(SELECT TOP 1 * FROM ATable ORDER BY AColumn ASC) first
UNION
SELECT * FROM
(SELECT TOP 1 * FROM ATable ORDER BY AColumn DESC) last