【问题标题】:How to compare times using specific lengths in SQLite?如何在 SQLite 中使用特定长度比较时间?
【发布时间】:2011-03-26 02:18:39
【问题描述】:

我有以 YYYY-MM-DD HH:MM:SS 形式存储的事件时间。

我要做的是找到在前一个触发器之后超过 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 小时的事件。

【问题讨论】:

    标签: sql sqlite datetime duration strftime


    【解决方案1】:

    您是否有理由要针对 Trigger.DateTime 测试 Event.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)
    

    【讨论】:

    • 像其他响应一样,这个逻辑是有道理的,但它似乎并没有正常工作,即使我将 +7 切换到 -7,我 认为 i> 是正确的方法
    • @Damon,您的表中有两个触发器,因此如果其中任何一个超过 7 小时,它将返回。您需要过滤触发器表,以便只获得您感兴趣的触发器。尽管 ^^;
    • 是 GROUP BY Trigger.DateTime HAVING...,但它返回除了最后一个事件之外的所有内容..
    • @Damon,
    • 它似乎只检查整个表上的最新触发器(而不是检查事件之前的触发器,这是我想要的)。不过,我觉得您编辑中的第一个应该正是我所需要的!特别是因为我单独测试了Select 1 From Trigger 部分并且它响应正确。但它只返回 20:00:00 .. 不是早上的
    【解决方案2】:

    怎么样

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

    【讨论】:

    • 这似乎不起作用..它似乎只是在第一次触发前 7 小时消除连续事件.. 或其他东西。不太确定它在做什么。不过,我没有意识到 datetime 函数这么简单......这很酷
    猜你喜欢
    • 2012-03-09
    • 2018-08-31
    • 2018-08-17
    • 2021-08-17
    • 1970-01-01
    • 2017-12-14
    • 2017-04-14
    相关资源
    最近更新 更多