【问题标题】:t-sql how to subtract two records from tablet-sql如何从表中减去两条记录
【发布时间】:2018-05-21 08:09:15
【问题描述】:

我有这样一个疑问:

SELECT Stamp_date , Stamp_Action FROM FILES_TIME_STAMPS
WHERE Stamp_File_Id = @FileID AND Stamp_Action IN (5,15)

我有这样的查询结果:

2017-12-04 12:56:37.293 5

2017-12-04 15:40:02.593 15

减去两条记录的最佳方法是什么?另外,如果我想轻松地维护它们,如何将它们定义为变量?

【问题讨论】:

  • 我认为你需要row_numbertop

标签: sql sql-server timestamp subtraction sql-timestamp


【解决方案1】:

如果您只想减去这两个日期,您可以使用DATEDIFFMIN -MAX

SELECT DATEDIFF(MINUTE, MIN(Stamp_date) , MAX(Stamp_date)) FROM FILES_TIME_STAMPS
WHERE Stamp_File_Id = @FileID AND Stamp_Action IN (5,15)

您可以根据需要将MINUTE更改为SECOND或其他datepart

另外,如果你想根据 Stamp_Action 选择 MIN 和 MAX,你可以使用这个。

SELECT DATEDIFF(MINUTE, 
    MIN(CASE WHEN Stamp_Action = 5 THEN Stamp_date END)  , 
    MAX(CASE WHEN Stamp_Action = 15 THEN Stamp_date END ) ) 
FROM FILES_TIME_STAMPS
WHERE Stamp_File_Id = @FileID AND Stamp_Action IN (5,15)

【讨论】:

  • 它正在工作!另外,我怎样才能将它们维护为不同的唯一值,也许是变量?例如,如果会有更多记录,但我只需要那个特定日期?因为例如可能有 3 条 id 为 5 的记录,但我需要选择最旧或最近的日期。
  • 恐怕它只适用于这种特殊情况。但如果它完成了它的工作,那就太好了:)
  • @BinaryTie 你可以在 MAX 和 MIN 函数中使用 CASE
【解决方案2】:

这是应用LAG函数的好例子:

declare @x table([date] datetime, [value] int)
insert into @x values ('2017-12-04 12:56:37.293', 5), ('2017-12-04 15:40:02.593', 15)

select *,LAG([date], 1) over (order by [date]) [DateLag],
       LAG([value], 1) over (order by [date]) [ValueLag],
       DATEDIFF(minute, [date],LAG([value], 1) over (order by [date])) [DateDifference],
       [value] - LAG([value], 1) over (order by [date]) [ValueDifference]
from @x

我包含了尽可能多的示例,因此您可以决定您需要什么并查看它是如何工作的 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-22
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    相关资源
    最近更新 更多