TSQL检查除最小值之外的日期差异



我有一个存储过程,它选择特定用户的所有消息,除了表中的消息:

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()会对每一行进行计算,这也可能导致索引无法使用。但请根据您自己的判断和测试结果得出结论。

最新更新