SQLite: выбрать строку в зависимости от времени суток? - PullRequest
1 голос
/ 05 февраля 2011

У меня есть таблица 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 Если текущее время 04:01, оно вернет zone4

и так далее ...

Пока что мне повезло, но не совсем то, что я хотел

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

Я пробовал несколько вариантов приведенного выше утверждения, но ни один из них не возвращает результат, который мне нужен.

Спасибо!

Ответы [ 3 ]

5 голосов
/ 05 февраля 2011

Вы значительно упростите свою жизнь, если добавите поле «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;
0 голосов
/ 05 февраля 2011

Две версии.

Это проще всего понять, но предполагается, что 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 () на time('now','localtime') в производственном процессе.
  • Ожидайте пустойустановить, если вы выполните любой из этих запросов до 08:00 по местному времени.
0 голосов
/ 05 февраля 2011

Вы пробовали использовать пункт?

SELECT * FROM table WHERE StartTime >= time('now', 'localtime')
HAVING StartTime = MIN(StartTime) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...