2016-05-16 205 views
1

假设其中包含了状态,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' 

回答

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()中减去结果。

+0

比我做得更简单。谢谢! –

0

鉴于你的问题的措辞,你会不会只根据当前记录的RecordFromDate选择年龄?如果我误解了,请用示例输出的具体/样本数据&来澄清您的问题。

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'