2015-07-10 73 views
0

我有一个审计表,它在多行中存储主表的“状态”值,每行都有一个日期/时间戳。让我们调用主表“项目”,它通过不同的状态更改:打开,待定,关闭。但是有时项目在关闭后可以重新开放。数据是这样的:从多行查找日期/时间间隔T-SQL

ProjectId Date   Status 
1234   07-01-2015 Open 
1234   07-03-2015 Pending 
1234   07-05-2015 Closed 
1234   07-06-2015 Open 

我需要一个日期参数值,并确定状态的项目“1234”是对给定的日期。

ex: Date=07-02-2015 would give me "Open" Date=07-07-2015 would also give me "Open" Date=07-03-2015 would give me "Pending"

我遇到的问题是,SQL需要看看周围行(如果有的话)

+0

“周围的行”是什么意思? – FutbolFan

+0

什么版本的sql server? – APH

+0

2008 R2,周围排意,07-01至07-03是开放的,而且07-06向前也是开放的。我想一个更简单的解释是,我需要能够告诉我的项目是否在'x'日期的状态'x'。这是来自疯狂的功能请求,以告知用户在过去的任何给定日期中项目状态是什么。 – n4esa

回答

2

1)窗口内日期限制的行唯一的行。 2)按日期倒序排列的结果(把最近在顶部) 3)如果你有2012选择第一行

DECLARE @CheckDate DATETIME = '07-07-2015', 
     @ProjectId INT = 1234 

-- To ignore time, set the check date to the first millisecond of the 
-- next day and use a less than operator 
SET @CheckDate = DATEADD(dd, DATEDIFF(dd, 0, @CheckDate) + 1, 0) 

SELECT TOP 1 
     [Status] 
FROM  [Project] 
WHERE [ProjectId] = @ProjectId 
AND  [Date] < @CheckDate 
ORDER BY [Date] DESC 
+1

这也是我的做法。但我想补充一点(就像一个提示),这种构造应该知道状态改变的时间。大多数情况下,这会在稍后发生变更请求,并且会造成大量重新工作! – Shnugo

+0

所以真的!谢谢 ;) – Malk

0

或更高版本,可以如下用Lead做到这一点:

declare @date datetime = '7-2-15' --or whatever 

select ProjectID, Status from ( 
    select * 
     , lead(date) over (partition by projectID order by date) as NextEvent 
    from MyTable) a 
where @date between [date] and isnull(NextEvent, @date + 1) 

否则,您可以使用row_number和自联接来近似lead

请注意,根据日期的精确程度,您可能需要使用类似where @date >= date and @date < isnull(NextEvent, @date + 1)而不是between