SQL日期选择为NULL,After,Before,Between

GBr*_*man 4 sql sql-server-2008

要求:按日期选择After,Before,Between或all if null

我正在使用SQL Server 2008

这是我的尝试,但我在代码之外的语法错误是有效的.

  1. 有更好的方法吗?
  2. 用例是什么语法正确?

    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)

Mic*_*son 6

或者,您不能通过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)

编辑:

这两种方法之间的执行计划可能存在差异,因此您可以尝试这两种方法,看看是否有一种方法优于其他方法......