Выбор даты SQL как NULL, После, До, Между - PullRequest
4 голосов
/ 24 января 2012

Требование: выберите по дате как После, До, Между или все, если ноль

Я использую 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;
    

Ответы [ 3 ]

6 голосов
/ 24 января 2012

С другой стороны, вы не можете ограничиться параметром даты, если это 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)

Или ... вы можете обработать 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')

EDIT:

Может быть разница в плане выполнения между этими двумя подходами, поэтому вы можете попробовать оба метода и посмотреть, превосходит ли один другой другой ...

0 голосов
/ 24 января 2012

Обратите внимание, что нижеприведенный запрос * следует избегать, и следует указать конкретные имена столбцов.

declare @StartDate datetime;    
declare @EndDate datetime;
SET @EndDate = GETDATE();
SET @StartDate = DATEADD(year, -2, GETDATE()); 

Declare @SQL Varchar(1000)

Set @SQL = 'select ColumnName
from ArCustomer
where CAST(Customer as int) > 1000
AND'
if(@StartDate IS NOT NULL AND @EndDate IS NOT NULL)
Begin
    Set @SQL = @SQL + ' ArCustomer.DateLastSale BETWEEN ''' + Convert(varchar, @StartDate) + 
    ''' AND ''' + Convert(varchar, @EndDate) + ''''
End
else if(@StartDate IS NULL AND @EndDate IS NOT NULL)
Begin   
        Set @SQL = @SQL + ' ArCustomer.DateLastSale < ''' + Convert(varchar, @EndDate) + ''''
End
else
    Set @SQL = @SQL + ' ArCustomer.DateLastSale > ''' + Convert(varchar, @StartDate) + ''''        


exec(@SQL)

Рассмотрены все дела.

0 голосов
/ 24 января 2012
WHERE CAST(Customer as int) > 1000 AND
     (@StartDate IS NULL OR @StartDate <= ArCustomer.DateLastSale) AND
     (@EndDate IS NULL OR ArCustomer.DateLastSale <= @EndDate) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...