SQLite:根据时间选择行?

时间:2011-02-05 11:27:09

标签: sqlite datetime time

我有一个SQLite表,如下所示:

+-----------+-------+
| StartTime | Name  |
+-----------+-------+
|  08:00:00 | zone1 |
|  13:00:00 | zone2 |
|  17:30:00 | zone3 |
|  22:00:00 | zone4 |
+-----------+-------+

我正在尝试编写一个基于当前时间返回行的查询:

如果CurrentTime是08:30,它将返回zone1 如果CurrentTime是16:40,它将返回zone2 如果Currenttime是04:01,它将返回zone4

依旧......

到目前为止,我有一些运气但不完全是我想要的

SELECT * FROM table WHERE StartTime >= time('now', 'localtime') 
ORDER BY StartTime LIMIT 1;

我已经尝试了上述语句的一些变体,但没有一个返回我之后的结果。

谢谢!

3 个答案:

答案 0 :(得分:5)

如果您添加“EndTime”字段,您将使您的生活更轻松,因为您可以简单地检查当前时间是否在开始和结束时间之内。

例如,如果您的数据库表由以下内容组成......

+-----------+----------+-------+
| StartTime | EndTime  | Name  |
+-----------+----------+-------+
|  08:00:00 | 12:59:59 | zone1 |
|  13:00:00 | 17:29:59 | zone2 |
|  17:30:00 | 21:59:59 | zone3 |
|  22:00:00 | 07:59:59 | zone4 |
+-----------+----------+-------+

...您可以简单地使用以下行的查询:

SELECT Name FROM table WHERE StartTime >= time('now', 'localtime')
AND EndTime <= time('now', 'localtime')
ORDER BY StartTime LIMIT 1;

答案 1 :(得分:0)

您是否尝试过拥有条款?

SELECT * FROM table WHERE StartTime >= time('now', 'localtime')
HAVING StartTime = MIN(StartTime) 

答案 2 :(得分:0)

两个版本。

这是最容易理解的,但它假设max(Name)是有意义的。也就是说,它假定“名称”中的值从低到高排序。

SELECT max(Name) 
FROM yourtable
WHERE StartTime< time("16:40:00");

此版本使用标量子查询。它不依赖于名称的任何有意义的顺序。我认为这个版本更强大。

SELECT Name 
FROM yourtable 
WHERE StartTime = (SELECT max(StartTime) 
                   FROM yourtable
                   WHERE StartTime < time("16:40:00")
);
  • 你想要更换时间() 文字与 time('now','localtime') in 生产。
  • 如果您运行任何一个,则期待空集 这些查询在当地时间08:00之前 时间。