sqlite3 дата операции при соединении двух таблиц в представлении? - PullRequest
2 голосов
/ 01 мая 2010

Короче говоря, как добавить минуты к дате и времени из целого числа, расположенного в другой таблице, в одном операторе выбора, соединяя их в sqlite3?

У меня есть sqlite3 db с:

таблица P (int id, ..., int minutes) и таблица S (int id, int p_id, datetime start)

Я хочу создать представление, которое дает мне PS (S.id, P.id, S.start + P.minutes), присоединяясь к S.p_id = P.id

Проблема в том, что если бы я генерировал запрос из приложения, я мог бы делать что-то вроде:

select datetime('2010-04-21 14:00', '+20 minutes');
2010-04-21 14:20:00

Создав строку «+20 минут» в приложении и передав ее в sqlite. Однако я не могу найти способ создать эту строку в самом выделении:

select p.*,datetime(s.start_at, formatstring('+%s minutes', p.minutes)) from p,s where s.p_id=p.id;

Поскольку sqlite, как говорится в документации, не предоставляет никакой функции форматирования строки, я также не вижу альтернативного способа выражения модификаторов даты.

В MySQL модификаторы даты не основаны на строках, поэтому на самом деле это работает:

mysql> create table p ( id integer, minutes integer);
mysql> create table s ( id integer, p_id integer, start datetime);
mysql> insert into p values (1, 10);
mysql> insert into p values (2, 15);
mysql> insert into s values (1, 1, '2008-12-31 14:00');
mysql> insert into s values (2, 1, '2008-12-31 15:00');
mysql> insert into s values (3, 2, '2008-05-10 13:30');
mysql> SELECT p.*,(s.start + INTERVAL p.minutes MINUTE) FROM p,s WHERE p.id=s.p_id;
+------+---------+---------------------------------------+
| id   | minutes | (s.start + INTERVAL p.minutes MINUTE) |
+------+---------+---------------------------------------+
|    1 |      10 | 2008-12-31 14:10:00                   | 
|    1 |      10 | 2008-12-31 15:10:00                   | 
|    2 |      15 | 2008-05-10 13:45:00                   | 
+------+---------+---------------------------------------+
3 rows in set (0.02 sec)

Ответы [ 2 ]

2 голосов
/ 02 мая 2010

Конкатенация не работает с помощью +. Однако || операнд конкатенации работал как положено.

Итак, MySQL

SELECT p.*,(s.start + INTERVAL p.minutes MINUTE) FROM p,s WHERE p.id=s.p_id;

Может быть записано в sqlite3 как:

select p.*, datetime(s.start, '+' || p.minutes || ' minutes') from p, s where s.p_id=p.id;

Что дает правильный ответ. Спасибо newtover за указание в правильном направлении.

1|10|2008-12-31 14:10:00
1|10|2008-12-31 15:10:00
2|15|2008-05-10 13:45:00
1 голос
/ 02 мая 2010

Почему бы просто не использовать конкатенацию?

SELECT ('+' + 10 + ' minutes')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...