GBr*_*man 4 sql sql-server-2008
要求:按日期选择After,Before,Between或all if null
我正在使用SQL Server 2008
这是我的尝试,但我在代码之外的语法错误是有效的.
用例是什么语法正确?
declare @StartDate datetime;
declare @EndDate datetime;
SET @EndDate = GETDATE();
SET @StartDate = DATEADD(year, -2, GETDATE());
select *
from ArCustomer
where CAST(Customer as int) > 1000
AND
CASE WHEN @StartDate IS NOT NULL AND @EndDate IS NOT NULL THEN
ArCustomer.DateLastSale BETWEEN @StartDate AND @EndDate
WHEN @StartDate IS NULL AND @EndDate IS NOT NULL THEN
ArCustomer.DateLastSale < @EndDate
WHEN @StartDate IS NOT NULL AND @EndDate IS NULL THEN
ArCustomer.DateLastSale > @StartDate
END;
Run Code Online (Sandbox Code Playgroud)或者,您不能通过date参数限制它是否NULL:
SELECT *
FROM ArCustomer ac
WHERE
CAST(ac.Customer as int) > 1000
AND (ac.DateLastSale >= @StartDate OR @StartDate IS NULL)
AND (ac.DateLastSale <= @EndDate OR @EndDate IS NULL)
Run Code Online (Sandbox Code Playgroud)
或者......您可以NULL将其视为低端或高端日期:
SELECT *
FROM ArCustomer ac
WHERE
CAST(ac.Customer as int) > 1000
AND ac.DateLastSale BETWEEN ISNULL(@StartDate, '1900-01-01')
AND ISNULL(@EndDate, '9999-12-31')
Run Code Online (Sandbox Code Playgroud)
编辑:
这两种方法之间的执行计划可能存在差异,因此您可以尝试这两种方法,看看是否有一种方法优于其他方法......