【问题标题】:SQL SERVER Time and Row ComparisonSQL SERVER 时间和行比较
【发布时间】:2016-11-17 16:41:13
【问题描述】:

我是 sql server 的新手。有没有办法可以比较前 2 行的时间?我的 id 是唯一的,所以如果我添加另一个时间,我想要相同的时间而不改变我的查询值。如果我的问题不清楚,我想知道最后两行的时差。

【问题讨论】:

  • 请添加预期结果以及一些示例数据
  • 要最后两行的时间差吗?
  • 是的,先生,如果我的问题不清楚。
  • 你想学习 SQL 吗?如果您有较新版本的 SQL Server,则可以使用 lead/lag()。如果您只是想学习,那么其他方法可能更合适。

标签: sql sql-server timestamp


【解决方案1】:

您可能会想出以下解决方案的十几种变体。如果你能理解它们,你就会在这个过程中学到很多 SQL。

-- scalar subqueries
select datediff(second, max("time"), (select max("time") from T)) as difference
from T
where "time" < (select max("time") from T)

-- correlated subquery
select datediff(
           second,
           (select t2."time" from T as t2 where t2."time" < t."time"),
           t."time") as difference
from T as t
where t.id = (select max(id) from T)

-- self outer joins
select datediff(second, max(t2."time"), max(t."time")) as difference
from T as t left outer join T as t2 on t2."time" < t."time" -- by time

select datediff(second, max(t2."time"), max(t."time")) as difference
from T as t left outer join T as t2 on t2.id = t.id - 1 -- by id

-- cross apply
select datediff(second, max(prev."time"), max(t."time")) as difference
from T as t cross apply
    (select max("time") from T as t2 where t2."time" < t."time") as prev("time")

-- cte with case expression
with max_time("time") as (select max("time") from T)
select min(case when t."time" <> max_time."time"
           then datediff(second, t."time", max_time."time") end) as difference
from T as t cross apply max_time

-- derived table and analytic functions
select difference
from (
    select
        row_number() over (order by "time" desc) as rn,
        datediff(second, lag("time") over (order by "time"), "time") as difference
    from T
) T2
where rn = 1

【讨论】:

    【解决方案2】:

    您可以像比较数字一样直接比较日期。

    SELECT id FROM table WHERE time >= '2016-07-15'
    

    要获得两次之间的差异,请使用 DATEDIFF

    http://www.techonthenet.com/sql_server/functions/datediff.php

    【讨论】:

    • 您需要将日期文字用单引号括起来。最好使用符合 ANSI 的 yyyy-mm-dd。在这种情况下,它将是“2016-07-05”。
    • 现在您已经修复了语法,我看不出这是如何回答问题的。当然,我们也不知道问题是什么。 ;)
    • 我认为他的问题实际上只是“我不知道如何比较日期”,所以我只是想为他指明正确的方向。不过,我想我本可以等待澄清:p
    • 真的很难说。不是想说你的回答有什么问题。这是一个可靠的答案......只是不确定这里提出的问题是什么。 :D
    • 对不起,我在问如何获得最后 2 行的时差。我现在很困惑:(
    猜你喜欢
    • 2011-05-27
    • 2011-03-19
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 2014-05-26
    • 2011-04-20
    相关资源
    最近更新 更多