【问题标题】:Ansi SQL for timestamp to intervals queryAnsi SQL 用于时间戳到间隔查询
【发布时间】:2014-12-03 15:10:44
【问题描述】:

假设我有一个表格,它告诉我某个事物何时被激活和停用:

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 apply 不适用于 Oracle 9。

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

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

【问题讨论】:

  • OUTER APPLY 的 ANSI 等效项是 JOIN LATERAL(但 Postgres 和 HSQLDB 是唯一支持的)
  • 顺便说一句:Oracle 9 早就被弃用了,你不应该使用它。
  • 我没有使用它,但我的一些客户正在使用,或者可能会使用。这完全是关于在之前某个日期做出的兼容性承诺。

标签: sql sql-server oracle timestamp ansi-sql


【解决方案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(以及几乎所有其他数据库)。

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

【讨论】:

  • 当。现在我觉得非常愚蠢.. :) 谢谢。我会在允许时接受。
  • @Mithon 。 . .对于大多数人来说,这是一个相当微妙的问题。你不应该觉得自己很愚蠢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 2015-12-09
  • 2014-08-21
  • 2020-02-14
  • 1970-01-01
  • 2017-05-29
  • 1970-01-01
相关资源
最近更新 更多