我有一个存储过程,它选择特定用户的所有消息,除了表中的消息:
ALTER PROCEDURE [dbo].[sp_LA_SelectAllUnreadMessagesForUser]
@UserID INT = 1
AS
BEGIN
SELECT *
FROM Message m
WHERE m.ID NOT IN (SELECT mt.MessageID
FROM MessageTracking mt
WHERE mt.SubscriberID = @UserID
)
AND m.DateExpires < GETDATE() /* With the other check */
ORDER BY m.DateCreated DESC
END
我需要将此扩展为不包括"过期消息"。
在Message
表上有一个DateExpires
列,但是—对于永久消息,DateExpires
被设置为1900-01-01 00:00:00.000
是否有办法检查日期是否在某个日期之后,除了当它是1900-01-01 00:00:00.000
?
试试这个:
SELECT *
FROM Message m
WHERE m.ID NOT IN (SELECT mt.MessageID
FROM MessageTracking mt
WHERE mt.SubscriberID = @UserID
)
AND (m.DateExpires > GETDATE()) OR (m.DateExpires = '1900-01-01 00:00:00.000'))
ORDER BY m.DateCreated DESC
您想要检查过期日期是否在当前日期之后,或者特定日期是否等于您的特殊值。
edit:
select *
where ( DateExpires = '19000101' OR DateExpires > getdate() )
,它将列出任何具有"never expire"条件的内容以及任何在当前日期/时间之后过期的内容
这应该可以为您工作:
Declare @Today = Getdate();
SELECT *
FROM Message m
WHERE m.ID NOT IN (SELECT mt.MessageID
FROM MessageTracking mt
WHERE mt.SubscriberID = @UserID
)
AND (m.DateExpires < @Today
OR m.DateExpires = '1900-01-01 00:00:00.000') /* With the other check */
ORDER BY m.DateCreated DESC;
我宁愿从where子句中删除getdate(),因为它可能导致性能不佳。原因:首先,getdate()会对每一行进行计算,这也可能导致索引无法使用。但请根据您自己的判断和测试结果得出结论。