表testTable
有4列
sessionid int
started datetime
ended datetime
SessionIsRunning bool
- 如果上次会话尚未结束,则为真。最多只有一条记录可以随时为真,因为最多只有一个会话可以运行。如果没有会话正在运行,那么所有记录都将其设置为false。如果有两个日期说fromDate
和toDate
,我该如何获得fromDate
之后或之后开始的第一个会话以及toDate
之前或之后结束的最后一个会话。棘手的情况是,如果一个会话正在进行中并且它是start date >= fromDate
我们需要这个。我猜测可能无法在一个sql语句中同时获取最小和最大会话ID,并保持代码可读且易于维护。两个单独的sql语句是可以的。一个得到最小,一个得到最大。然后我可以在min和max之间使用查询行。
最后一句话以不同的方式解释了它。获取所有已启动或正在运行并已结束或在/至日期之间运行的会话,谢谢
答案 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