日期分隔符返回超出范围的结果



我有一个非常复杂的查询。 其中一部分用 where 语句分隔,并排除放电日期大于 90 天前的结果

原始表中的日期格式为 2017-09-22

选择值如下所示

to_char("public".visit.visit_admit_date, 'MMDDYYYY') AS "Visit or Admit Date",
to_char("public".visit.visit_disch_date, 'MMDDYYYY') AS "Discharge Date",
WHERE
 exists ( SELECT distinct on ("public".visit.visit_id)  "public".procedure_group_cpt_code.pgrpcpt_code::text  
          FROM "public".visit 
          FULL OUTER JOIN "public".patient_procedure 
            ON "public".visit.visit_id = "public".patient_procedure.pproc_visit_num 
          FULL OUTER JOIN "public".procedure_desc_master_codes 
            ON "public".patient_procedure.pproc_cpcode = "public".procedure_desc_master_codes.pdescm_id 
          FULL OUTER JOIN "public".procedure_group_cpt_code 
            ON "public".procedure_group_cpt_code.pgrpcpt_pdescm_id = "public".procedure_desc_master_codes.pdescm_id

GROUP BY "public".visit.visit_id, "public".procedure_group_cpt_code.pgrpcpt_code  
ORDER BY "public".visit.visit_id )
AND  "public".visit.visit_stay_type = '1' OR "public".visit.visit_stay_type ='2'

最后一行是我认为按日期划分的正确方法。

AND "public".visit.visit_disch_date > (now() - interval '90 day' )

我的日期远远超出了几年前的范围

如果有人需要查看整个查询的更多内容,我会发布它。 它很大也很乐意包含任何人可能要求的更多信息。

问题是or . 请改用in

 "public".visit.visit_stay_type IN ('1', '2') AND
 "public".visit.visit_disch_date > (now() - interval '90 day' )

其他一些建议:

  • 学习使用表别名。
  • exists子查询中不需要select distinct on
  • order by几乎从不适合在子查询中使用。
  • 很少需要full outer join

同意IN比这里的OR更好,但是如果您想在将来的查询中使用OR(例如,IN不适合,因为您的OR将在不同的列上运行(,您应该使用括号对条件进行分组,如下所示:

AND (
  "public".visit.visit_stay_type = '1' 
  OR "public".visit.visit_stay_type ='2')
AND "public".visit.visit_disch_date > (now() - interval '90 day' )