查询具有历史记录的表中当前值的年龄

时间:2016-05-16 19:54:17

标签: sql sql-server tsql

假设一个历史表包含Status,RecordFromDate和RecordThruDate字段以及其他字段..

鉴于可以为任何字段的任何更改创建新记录,而不仅仅是状态字段,如何找到状态字段保持其当前值的时间长度?

当前记录的RecordThruDate由'9999-12-31'表示。

请注意,最后两个记录具有相同的状态,每个记录的日期需要包含在计算中

somefield, status, recfromdate, recthrudate
'abc', 1, '2016-04-01', '2016-04-10'
'abc', 2, '2016-04-11', '2016-04-16'
'def', 2, '2016-04-17', '2016-04-19'
'def', 3, '2016-04-20', '2016-04-25'
'ghi', 3, '2016-04-26', '9999-12-31'

2 个答案:

答案 0 :(得分:1)

以下内容获取上一个状态的最长日期:

select max(h.RecordThruDate)
from history h
where h.status <> (select h2.status
                   from history h2
                   where h2.recordthrudate = '9999-12-31'
                  );

您可能需要为其添加“1”以获取日期。要获得持续时间,请从getdate()中减去结果。

答案 1 :(得分:0)

考虑到你的问题的措辞,你不只是根据当前记录的RecordFromDate选择年龄吗?如果我误解,请详细说明您的问题/样本数据&amp;样本输出。

DECLARE @HistoryTable TABLE (RecordStatus VARCHAR(100), RecordFromDate DATETIME, RecordThruDate DATETIME)

INSERT INTO @HistoryTable (RecordStatus, RecordFromDate, RecordThruDate)
VALUES ('Pending','2016-01-01 09:34:05','2016-04-01 19:34:43'),
       ('Approved','2016-04-01 19:34:43','2016-05-09 11:45:43'),
       ('Shipped','2016-05-09 11:45:32','9999-12-31 00:00:00')

SELECT *, DATEDIFF(DD,RecordFromDate,GETDATE()) AS AgeInDays
FROM @HistoryTable
WHERE RecordThruDate='9999-12-31'