用于时间戳到时间间隔查询的Ansi SQL

用于时间戳到时间间隔查询的Ansi SQL,sql,sql-server,oracle,timestamp,ansi-sql,Sql,Sql Server,Oracle,Timestamp,Ansi Sql,比如说,我有一张表,它告诉我某个东西何时被激活和停用: CREATE TABLE [dbo].[active] ( [timestamp] [DATETIME] NOT NULL, [activated] [BIT] NOT NULL ) 我最好的尝试是对它进行查询,以检索事件处于活动状态的时间间隔: SELECT a.timestamp AS 'ActivatedDate', Deactivated.timestamp FROM active

比如说,我有一张表,它告诉我某个东西何时被激活和停用:

CREATE TABLE [dbo].[active] 
( 
    [timestamp] [DATETIME] NOT NULL, 
    [activated] [BIT] NOT NULL 
) 
我最好的尝试是对它进行查询,以检索事件处于活动状态的时间间隔:

SELECT a.timestamp AS 'ActivatedDate', 
       Deactivated.timestamp 
FROM   active a 
       OUTER apply (SELECT Min(d.timestamp) AS TimeStamp 
                    FROM   active d 
                    WHERE  activated = 0 
                           AND d.timestamp > a.timestamp) AS Deactivated 
WHERE  a.activated = 1 
我需要重写它,以便它能够与ANSI SQL或至少T-SQL和Oracle 9一起工作。据我所知,外部应用程序不适用于Oracle 9

如果有更好的方法来做这类事情,请分享!:)


我需要这个来检查当这个东西被启用/禁用时是否发生了某些事件。谢谢

使用相关子查询:

select a.timestamp as ActivatedDate,
       (select min(d.timestamp)
        from active d
        where d.activated = 0 and
              d.timestamp > a.timestamp
       ) as DeactivedDate
from active a
where a.activated = 1;
这是ANSI SQL,应该可以在SQL Server和Oracle(以及几乎所有其他数据库)中使用


注意:在任何给定的数据库中,都可能有更有效的方法来做您想做的事情。

Dang。现在我觉得自己非常愚蠢……)谢谢当它允许我的时候,我会接受。@Mithon。对大多数人来说,这是一个相当微妙的问题。你不应该觉得自己愚蠢。ANSI等效的
OUTER APPLY
是一个
JOIN LATERAL
(但Postgres和HSQLDB是唯一支持这一点的)顺便说一句:Oracle 9早就被弃用了,你不应该使用它。我没有使用它,但我的一些客户是,或者可能是。这一切都是关于兼容性的承诺是在以前的某个日期做出的。