¿Cláusula condicional Where basada en Sysdate?

Estoy creando una consulta que se ejecutará dos veces al mes:

  1. El día 5 del mes mirando los días de facturación 16-último día del mes del mes anterior.

    datepart(dd,h.BILLED_DATE) > 15    
    DATEPART(mm, h.billed_date) = DATEPART(mm,dateadd(m,-1,getdate()))
    and DATEPART(yyyy, h.billed_date) = DATEPART(yyyy,dateadd(m,-1,getdate()))
    
  2. El día 20 del mes mirando los días de facturación del 1 al 15 del mismo mes.

    datepart(dd,h.BILLED_DATE) >= 1
    and datepart(dd,h.BILLED_DATE) < 16
    and DATEPART(mm, h.BILLED_DATE) = DATEPART(mm,GETDATE())
    and DATEPART(yyyy, h.BILLED_DATE) = DATEPART(yyyy,GETDATE()))
    

Estos funcionan independientemente en la cláusula where. Sin embargo, cuando trato de combinarlos en una declaración de caso en la cláusula where, recibo muchos errores, comenzando con la primera desigualdad después de "entonces".

Where
  Case 
    when datepart(dd,getdate()) > 15 
      then [2 above]
      else [1 above]
  End

Cura mi ignorancia.

preguntado el 22 de mayo de 12 a las 18:05

No, metí la pata cortando y pegando. Está arreglado. Lo siento. -

2 Respuestas

CASE es una expresión que devuelve un único valor. No puede usarlo para controlar el flujo como puede hacerlo en otros idiomas.

Su consulta tampoco utilizará índices en su columna billed_date, que debería considerar agregar para respaldar esta consulta.

¿Qué tal esta reescritura, que utiliza operaciones puras de fecha y hora para crear un rango abierto en lugar de realizar todas esas costosas funciones de fecha y hora?

DECLARE @today SMALLDATETIME, @start SMALLDATETIME, @end SMALLDATETIME;
SET @today = DATEADD(DAY, 0, DATEDIFF(DAY, 0, CURRENT_TIMESTAMP));

SET @start = DATEADD(DAY, 1-DAY(@today), @today);
SET @end = DATEADD(DAY, 15, @start);

IF DATEPART(DAY, @today) <= 15
BEGIN
    SET @start = DATEADD(MONTH, -1, @end);
    SET @end = DATEADD(DAY, 1-DAY(@today), @today);
END 

SELECT ... WHERE h.billed_date >= @start AND h.billed_date < @end;

contestado el 22 de mayo de 12 a las 19:05

¿De qué reescritura estás hablando? - chris pfohl

@ChristopherPfohl dame un minuto, por favor. Lo sentimos, el editor perdió todo su formato/barras de herramientas, etc. Tuve que cerrar sesión y volver a iniciarla. - Aarón Bertrand

Esto debería hacerlo

WHERE (
    datepart(dd,getdate()) > 15 
    AND DATEPART(mm, enc.hosp_admsn_time) = DATEPART(mm,dateadd(m,-1,getdate()))
    AND DATEPART(yyyy, enc.hosp_admsn_time) = DATEPART(yyyy,dateadd(m,-1,getdate()))
) OR (
  datepart(dd,h.BILLED_DATE) >= 1
  and datepart(dd,h.BILLED_DATE) < 16
  and DATEPART(mm, h.BILLED_DATE) = DATEPART(mm,GETDATE())
  and DATEPART(yyyy, h.BILLED_DATE) = DATEPART(yyyy,GETDATE()))
)

contestado el 22 de mayo de 12 a las 18:05

No busco transacciones de ningún período. Esto se configurará para que se ejecute y se entregue automáticamente. Si se ejecuta el día 5 del mes, entonces debe buscar el día 16, el último día del mes anterior. Si se ejecuta el día 20 del mes, debe buscar del 1 al 15 del mismo mes. - texas_mike81

Esta consulta incluirá filas de los primeros 15 días de este mes, independientemente de la fecha actual. También incluirá todas las filas del mes pasado si la fecha de hoy es posterior al día 15. Ninguna de estas opciones parece lo que busca el OP. - Aarón Bertrand

Ustedes tienen razón. Hice un cambio demasiado mecánico sin leer lo suficientemente profundo. Punto tomado, lección aprendida. - azulvector

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.