Как сравнить время, используя конкретные длины в SQLite? - PullRequest
0 голосов
/ 26 марта 2011

У меня есть время события, сохраненное в форме ГГГГ-ММ-ДД ЧЧ: ММ: СС.

Что я пытаюсь сделать, это найти все экземпляры события, где оно происходит более чем через 7 часов после предыдущегоСпусковой крючок.Я не уверен, что самый простой способ сделать это после прочтения документации SQLite Date.Я предполагаю, что мне придется каким-то образом использовать strftime, но я действительно не знаю, как к нему подойти.

Это базовый запрос, из которого мне нужно будет построить:

SELECT * FROM Event WHERE Event.DateTime (is more than 7 hours after) (SELECT Trigger.DateTime FROM Trigger WHERE Event.DateTime > Trigger.DateTime)

У меня есть тестовые данные, настроенные в настоящее время следующим образом:

DROP TABLE IF EXISTS "Event";
CREATE TABLE "Event" ("DateTime" TEXT, "ID" INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL  UNIQUE );
INSERT INTO "Event" VALUES('2000-01-01 08:00:00',1);
INSERT INTO "Event" VALUES('2000-01-01 09:00:00',2);
INSERT INTO "Event" VALUES('2000-01-01 14:00:00',3);
INSERT INTO "Event" VALUES('2000-01-01 15:00:00',4);
INSERT INTO "Event" VALUES('2000-01-01 20:00:00',5);
DROP TABLE IF EXISTS "Trigger";
CREATE TABLE "Trigger" ("DateTime" TEXT, "ID" INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL  UNIQUE );
INSERT INTO "Trigger" VALUES('2000-01-01 00:00:01',1);
INSERT INTO "Trigger" VALUES('2000-01-01 10:00:01',2);

, поэтому он должен возвращать 1, 2 и 5 из событий, так как это те, которые старше 7 часов послетриггер.

Ответы [ 2 ]

1 голос
/ 26 марта 2011

Есть ли причина, по которой вы хотите дважды протестировать Event.DateTime и Trigger.DateTime?Я думаю, что это должно работать так же хорошо:

SELECT * FROM Event 
WHERE EXISTS(SELECT 1 FROM Trigger 
             WHERE datetime(Event.DateTime,'+7 hours') > Trigger.DateTime)

ОБНОВЛЕНИЕ

Поскольку вы хотите сравнить только с последним триггером, это будет что-то вроде этого:

SELECT * FROM Event 
WHERE EXISTS(SELECT MAX(Trigger.DateTime) newest FROM Trigger 
             HAVING datetime(Event.DateTime,'-7 hours') > newest)

Редактировать

SELECT * FROM Event 
WHERE NOT EXISTS(SELECT 1 FROM Trigger 
                 WHERE datetime(Event.DateTime,'-7 hours') <= Trigger.DateTime)

SELECT * FROM Event 
WHERE datetime(Event.DateTime,'-7 hours') > 
            (SELECT MAX(Trigger.DateTime) newest FROM Trigger)

Редактировать2

SELECT * FROM Event 
WHERE NOT EXISTS(SELECT 1 FROM Trigger 
                 WHERE Trigger.DateTime BETWEEN datetime(Event.DateTime,'-7 hours') AND Event.DateTime)

SELECT * FROM Event 
WHERE datetime(Event.DateTime,'-7 hours') > 
            (SELECT MAX(Trigger.DateTime) newest FROM Trigger
             WHERE Trigger.DateTime < Event.DateTime)
0 голосов
/ 26 марта 2011

Как насчет

SELECT * FROM Event 
WHERE datetime(Event.DateTime,'+7 hours') > (SELECT Trigger.DateTime FROM Trigger 
                                           WHERE Event.DateTime > Trigger.DateTime)
...