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

时间:2014-12-03 15:10:45

标签: 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 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.我的理解是OUTER适用于Oracle 9不适用。

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

我需要这个以检查在启用/禁用此事件时是否发生了某些事件。谢谢!

1 个答案:

答案 0 :(得分:1)

使用相关子查询:

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(以及几乎所有其他数据库)中工作。

请注意:可能有更有效的方法在任何给定的数据库中执行您想要的操作。