SQL Server Case语句不过滤记录

时间:2016-09-20 00:02:32

标签: sql sql-server tsql case

我认为案例陈述不会过滤记录。开发人员坚持认为它确实......

我想限制具有日期范围的记录数,但此代码不会这样做。

declare @ClientId [int],
        @EventStartDate DateTime,
        @EventEndDate DateTime

set @ClientId = 1
set @EventStartDate = '2016-05-23'
set @EventEndDate = '2016-09-08'

SELECT 
    [CalendarEventId], [ClientId],
    [EventDate],
    [Title],
    [EventText],
    [CreatedBy], [CreatedDate],
    [ModifiedBy], [ModifiedDate],
    CASE 
       WHEN [EventDate] >= @EventStartDate
            AND EventDate <= @EventEndDate 
         THEN 'ACTIVE'
         ELSE 'NOT ACTIVE' 
    END AS [STATUS]
FROM 
    [dbo].[CalendarEvent]
WHERE 
    ClientId = @ClientId
ORDER BY 
    EventDate

2 个答案:

答案 0 :(得分:4)

你断言代码没有在日期过滤是正确的,你的朋友说错了。

如果您想要按日期范围进行过滤,则需要将where子句更改为:

WHERE ClientId = @ClientId 
  AND EventDate >= @EventStartDate
  AND EventDate <= @EventEndDate 

查询中唯一的case表达式是有条件地设置结果集中列的输出。

答案 1 :(得分:0)

我们也可以使用BETWEEN,它也很简单,只是提供替代方案,虽然你可以使用任何两个返回相同的结果:

FROM [dbo].[CalendarEvent]
WHERE ClientId = @ClientId
    AND EventDate BETWEEN @EventStartDate AND @EventEndDate
ORDER BY EventDate