我有一个名为'Contracts'的SQL Server 2005表:
CREATE TABLE Contracts (
ContractNo int not null,
ExpirationDate smalldatetime not null,
NotificationInAdvancedDays int not null
)
我想只显示通知期内的合同(ExpirationDate+DaysNotificationInAdvanced
)或已过期的合同(ExpirationDate<CurrentDate
)。
答案 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()