Función de comparación de fechas en SQL Server

Estoy tratando de mostrar los registros que se crearon después del 1 de octubre de 2010. Pero mi consulta no parece funcionar. También muestra registros de 2004 a septiembre de 2010, que no se desean.

¿Qué hay de malo en la siguiente consulta?

select Distinct app.app_id,
  (convert(varchar, creation_date,101) + ' ' +  convert(varchar,creation_date ,108)) as creation_date,
  dbo.oea_fn_get_amc_mem_name(app.app_id,primary_msn,getdate(), 'EN', 30000) PIName,
  dbo.oea_fn_get_pid_countyname(app.app_id,primary_msn,'OC')as PIpid,
  primary_msn,
  zip,
  home_tel,
  work_tel,
  work_extn,
  other_contact,
  other_ext,
  cell_tel,

  dbo.oea_fn_get_amc_mem_name(app.app_id,mem.msn,getdate(), 'EN', 30000)as Kname,
  dbo.oea_fn_get_pid_countyname(app.app_id,mem.msn,'OC')as Knamepid,
  mem.msn as Kmsn,
  (select count(reminder_id) from reminders (nolock) where app_id=app.app_id) as reminder

from app_application app  (nolock)
inner join app_member mem  with (nolock) on  app.app_id=mem.app_id 
--left outer join Oea_App_Program_Disposition disp with (nolock) on mem.app_id = disp.app_id and mem.msn=disp.msn
inner join app_address aadd with (nolock) on app.app_id=aadd.app_id
--inner join app_calc_results calc  with (nolock) on mem.app_id=calc.app_id and calc.msn=mem.msn
left outer join app_member_benefits ben with (nolock) on mem.app_id = ben.app_id and mem.msn=ben.msn

where  
 isnull(mem.coverage_required,0) = 1
 and app.app_status = 's'
     and ben.ins_end_date < getdate()
     and app.client_id = 30000
     and app.app_id  not in (select app_id from app_renewal) 
     and (mem.msn in (select calc.msn from app_calc_results calc 
                 inner join app_application app on calc.app_id = app.app_id and calc.prog_id = 'CK' and calc.opt_out = 1))
     and (mem.msn in (select msn from app_calc_results where app_id=app.app_id and status not in ('A','X')))
     or (mem.msn in (select msn from Oea_App_Program_Disposition where app_id=app.app_id and disp_status not in ('A','P')) )
     and app.creation_date >= '10/01/2010'

Gracias por toda la ayuda.

preguntado el 16 de mayo de 11 a las 18:05

A primera vista, lo más probable es que su problema sea que or en la cláusula where ... se incluirá todo lo que cumpla con esa condición, independientemente de su fecha. -

Si comenta la cláusula O, ¿solo obtiene resultados del 2010-10-01? -

2 Respuestas

Probablemente quieras esto:

 and (
     (mem.msn in (select calc.msn from app_calc_results calc 
                 inner join app_application app on calc.app_id = app.app_id and calc.prog_id = 'CK' and calc.opt_out = 1))
    or (mem.msn in (select msn from app_calc_results where app_id=app.app_id and status not in ('A','X')))
    or (mem.msn in (select msn from Oea_App_Program_Disposition where app_id=app.app_id and disp_status not in ('A','P')) )
     )
 and app.creation_date >= '10/01/2010'

El problema está en la lógica detrás de o en la cláusula where.

contestado el 16 de mayo de 11 a las 22:05

Gracias. Hmmm ... todas las otras respuestas se fueron. JAJAJA. - Hogan

@userstackoverflow - porque su problema es con el or reconsidere la lógica de lo que quiere o quiere. Es posible que deba repetir algunas de las declaraciones dos veces dentro de los dos "lados" de o. - Hogan

Además, sugeriría sangrar y alinear los paréntesis para que esté seguro de que tiene lo que cree que tiene. - Tom H

@userstackoverflow - Adiviné la lógica ... pero solo tú lo sabes. Ver editar. - Hogan

Hogan ... U son increíbles. Gracias por la sugerencia. Sangría y alineación de paréntesis funcionó. Una vez mas, Gracias. Realmente lo aprecio. - userstackoverflow

Como han dicho otros, es probable que el problema sea la cláusula Or en la cláusula Where. En efecto, su consulta es:

Select ...
From ..
Where (A And B And C 
    And D And E 
    And F And G
    And app.creation_date >= '10/01/2010'
    )
    Or mem.msn In   (
                    Select msn 
                    From Oea_App_Program_Disposition 
                    Where app_id=app.app_id 
                        And disp_status not in ('A','P')
                    )

Por lo tanto, si para cualquier fila, si el Or es cierto, el resto de las "Ands" se ignoran. Asumiría que el Or se supone que está emparejado con uno de los And cláusulas.

contestado el 16 de mayo de 11 a las 22:05

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