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

时间:2014-08-25 07:19:34

标签: sql sql-server

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

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

我需要将其扩展为不包含“过期消息”。

DateExpires表格上有一个Message列,但是对于永久消息,DateExpires设置为1900-01-01 00:00:00.000

有没有办法检查日期是否在某个特定日期之后,除了1900-01-01 00:00:00.000时?

3 个答案:

答案 0 :(得分:2)

试试这个:

 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

您想要检查有效期是在当前日期之后,还是特定日期等于您的特殊价值。

答案 1 :(得分:1)

编辑:

select *
where ( DateExpires = '19000101' OR DateExpires > getdate() )

将列出任何有&#34;永不过期的#34;条件加上在当前日期/时间之后过期的任何条件

答案 2 :(得分:0)

这应该适合你:

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(),它也可能导致非指数。但请使用您自己的判断和测试结果得出结论。