2010-05-01 6 views
2

En bref, comment ajouter des minutes à un datetime à partir d'un entier situé dans une autre table, dans une instruction select, en les rejoignant, dans sqlite3?sqlite3 opérations de date lors de la jonction de deux tables dans une vue?

J'ai un sqlite3 db avec:

tableau P (id int, ..., int minutes) et une table S (id int, int p_id, start datetime)

Je veux pour générer une vue qui me donne PS (S.id, P.id, S.start + P.minutes) en rejoignant S.p_id = P.id

Le problème est, si je générais la requête à partir du application, je peux faire des choses comme:

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

En créant la chaîne '+20 minutes' dans l'application, puis en la passant dans sqlite. Cependant, je ne peux pas trouver un moyen de créer cette chaîne dans la sélection elle-même:

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

Parce que sqlite jusqu'à la documentation indique, ne fournit pas de fonction de format de chaîne, et je ne peux voir aucune autre façon d'exprimer la modificateurs de date.

En MySQL, les modificateurs de date ne sont pas basées sur des chaînes, donc il fonctionne réellement:

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) 

Répondre

2

Enchaînement ne fonctionne pas à l'aide +. Cependant le || l'opérande de concaténation a fonctionné comme prévu.

Alors

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

Peut être écrit en SQLite3:

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

qui produit la bonne réponse. Merci à newtover pour pointer dans la bonne direction.

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

Pourquoi ne pas simplement utiliser la concaténation ?:

SELECT ('+' + 10 + ' minutes') 
+0

La concaténation semble être le chemin à parcourir. Cependant le + n'était pas le bon opérateur, il a produit un résultat vide. – duncan

+0

+ est une addition numérique. Vous devez utiliser || pour la concaténation de chaînes. – dan04

+0

@duncan et @ dan04: Je n'étais pas sûr de l'opérateur correct, merci. – newtover

Questions connexes