2016-05-16 3 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'