Вместо использования выражения CASE
в WHERE
, которое не является SARGable, вам будет гораздо лучше использовать переменные:
DECLARE @StartDate DATE, @EndDate Date;
SET @StartDate = CASE DATEPART(MONTH,GETDATE()) WHEN 1 THEN DATEADD(YEAR, DATEDIFF(YEAR, 0,GETDATE())-1,0)
ELSE DATEADD(YEAR, DATEDIFF(YEAR,0,GETDATE()),0)
END;
SET @EndDate = DATEADD(YEAR,DATEDIFF(YEAR, 0,@StartDate)+1,0);
--SELECT @StartDate, @EndDate; --Uncomment to check the values, but would break SSRS, as it only reads the first returned dataset.
SELECT [name],
[owner],
duedate,
submitteddate
FROM [Table]
WHERE submitteddate >= @StartDate
AND submitteddate < @EndDate;
Обратите внимание, что нет необходимости проверять,значение submitteddate
равно NULL
или нет.NULL = {expression}
всегда приведет к «неизвестному», что не соответствует действительности и, следовательно, не будет возвращено в наборе данных.Таким образом, если вам не нужны значения NULL
, то предложение IS NOT NULL
не имеет смысла в WHERE
, например:
WHERE [Column] IS NOT NULL
AND [Column] = 1;
Вышеприведенное будет возвращать в точности те же строки, что и:
WHERE [Column] = 1;