Select 通过比较日期和时间有条件地记录

Select record conditionally by comparing date and time

使用 SQLite,如何检索当前时间介于记录开始和停止时间之间的第一条记录,或者,如果当前时间超出所有现有记录的 start/stop 次,则取而代之的是检索记录在当前本地时间之后是下一个吗?

这是我的 table:

TABLE sessions (
    session_id    INTEGER PRIMARY KEY AUTOINCREMENT,
    session_start REAL,
    session_stop  REAL,
    group_id      INTEGER REFERENCES [groups] (group_id) ON DELETE CASCADE
);

示例数据:

session_id  session_start       session_stop        group_id
1           2459599.755438762   2459599.963772095   1
2           2459600.0471054283  2459600.1721054283  2
3           2459600.755438762   2459600.963772095   1

会话 table 有一个外键,group_id,但为了示例,我们可以将其放在一边。

编辑:

在小型测试应用程序中尝试了 mankowitz 的建议:

SQL.Text:='SELECT *, julianday(''Now'',''localtime'') AS julian_now FROM sessions '
+'WHERE session_start > julian_now '
+'ORDER BY session_stop < julian_now LIMIT 1'; 

运行时的当前时间是 2022-01-17 05:40:45,应该选择 session_id 16 的记录,因为它是最接近时间的。如何为此修改代码?

select * 来自 sesson_start>{currenttime} 的会话 按 session_end<{currenttime} 排序 限制 1

对于条件:

current time is between record start and stop times

您需要在 ORDER BY 子句中使用此布尔表达式:

julianday('now', 'localtime') BETWEEN session_start AND session_stop

条件:

OR ELSE, if current time is outside start/stop times of all existing records, instead retrieve the record that comes next in time after current local time

你需要这个:

julianday('now', 'localtime') > session_stop

这样写您的查询:

SELECT *
FROM sessions 
ORDER BY julianday('now', 'localtime') BETWEEN session_start AND session_stop DESC,
         julianday('now', 'localtime') > session_stop DESC,
         session_start  
LIMIT 1;