2011-03-24 15 views
5

Tengo un formulario, donde el usuario saca un informe. En el formulario, pueden elegir una fecha de inicio y una fecha de finalización, o pasar por un valor nulo para ambos valores. Si eligen nulo, devuelve todos los registros en los que no parece que la sentencia CASE EFFECTIVEDATE < GETDATE() para recibir el medio, ni tampoco lo hace como operadores '<'Usar BETWEEN en SQL CASE donde la cláusula

Aquí es mi guión

SELECT * FROM tbReport 
WHERE 
    EffectiveDate 
    CASE 
     WHEN (@StartDate IS NOT NULL AND @EndDate IS NOT NULL) 
     THEN BETWEEN (@StartDate AND @EndDate)   
     ELSE 
        THEN < GETDATE() 

    END 

Respuesta

7

Usted podría volver a escribir sin un caso, como:

SELECT * 
FROM tbReport 
WHERE (
      @StartDate is not null 
      and 
      @EndDate is not null 
      and 
      EffectiveDate between @StartDate AND @EndDate 
     ) 
     or 
     (
      (
       @StartDate is null 
       or 
       @EndDate is null 
      ) 
      and 
      EffectiveDate < getdate() 
     ) 
+0

Gracias, esta respuesta tiene más sentido para mí y tiene en cuenta todas las condiciones. – MeltdownZA

+0

Funciona, pero ¿no es un poco complicado para lo que se requiere? No sería mi primera elección desde el punto de vista de la mantenibilidad. – SecretDeveloper

0

su sintaxis para CASE es todo mal aquí .. Tal vez puedas probar:

SELECT * FROM tbReport 
WHERE 
    (@StartDate is null and @EndDate is null and EffectiveDate < GetDate()) or 
    (@StartDate is not null and @EndDate is not null and 
    EffectiveDate >= @StartDate and EffectiveDate <= @EndDate) 
+0

Si bien esta es una muy buena selección ... debe poner una o entre la primera @startdate y @enddate (@StartDate es nula o @EndDate es nula) y EffectiveDate

2

Asumiendo que este es SQL Server, puede simplificar mediante el uso de isnull:

select * 
from tbReport 
where EffectiveDate between isnull(@StartDate, '1 Jan 1990') 
     and isnull(@EndDate, getdate()) 
+0

+1 Probablemente lo que significa el OP y muy conciso – Andomar

+0

Desafortunadamente eso no toma en cuenta que si cualquiera de las fechas es nula, regrese todos los registros donde effectivedate MeltdownZA

+0

Sí si saca el BETWEEN y usa AND maneja cuando cualquiera de los params son nulos. Mira mi respuesta para ver a qué me refiero. – SecretDeveloper

2

Algo como esto debería funcionar, no he comprobado la sintaxis es correcta, sin embargo.

SELECT * FROM tbReport 
WHERE EffectiveDate < IsNull(@EndDate,GetDate()) 
AND EffectiveDate > IsNull(@StartDate,'01/01/1979') 
0

la instrucción SQL no está escrita correctamente. Case no elegirá condicionalmente el código evaluado. Puede ver el caso como un valor, por lo que debe colocar un operador entre la caja y el otro operando.

Una de las múltiples formas de escribir esto sería:

where 
case when @StartDate IS NOT NULL AND @EndDate IS NOT NULL and EffectiveDate BETWEEN (@StartDate AND @EndDate) then 1 
case when (@StartDate IS NULL OR @EndDate IS NULL) and EffectiveDate <getdate() then 1 
else 0 end = 1 

Si no desea escribir con el caso se puede elegir una de las soluciones antes, pero que utiliza una fecha de inicio discreto.

Cuestiones relacionadas