选择仅在通知期内或已过期的合同

时间:2011-05-10 14:16:57

标签: sql-server date

我有一个名为'Contracts'的SQL Server 2005表:

CREATE TABLE Contracts (
    ContractNo int not null,
    ExpirationDate smalldatetime not null,
    NotificationInAdvancedDays int not null
)

我想只显示通知期内的合同(ExpirationDate+DaysNotificationInAdvanced)或已过期的合同(ExpirationDate<CurrentDate)。

2 个答案:

答案 0 :(得分:2)

查看SQL Server中的DateAdd函数。

有了它,您可以在where子句中执行此操作:

where (GetDate() > DateAdd(DAY, DaysNotificationAdvanced * -1, ExpirationDate) OR GetDate() > ExpirationDate)

由于SQL Server中没有DateSubtract函数,我将DaysNotificationAdvanced多了-1,从ExpirationDate中减去它。

更新:正如JNK在评论中提到的那样,如果你想要返回通知期内的合同,你真的不需要在where子句“OR GetDate()&gt; ExpirationDate”中有第二个条件或以后。

也许您可以增强查询中的选择列表,以指明合同是在通知期还是已过期:

SELECT ContractNo, 
       ExpirationDate,
       DaysNotificationAdvanced
       CASE WHEN GETDATE() > ExpirationDate THEN 'Expired' 
       ELSE 'About To Expire' END AS ContractStatus
FROM Contracts
WHERE GetDate() > DateAdd(DAY, DaysNotificationAdvanced * -1, ExpirationDate

答案 1 :(得分:0)

你可以这样做:

SELECT * 
FROM Contracts 
WHERE GETDATE() > DATEADD(day,-1*daysInAdvance,expirationDate) 
OR expirationDate < GETDATE()