sql 查询获取两个日期之间的数据

sql query to get data between two dates

我有一个tablecomp_sal-

  PERSON_NUMBER         DATE_FROM                 DATE_TO                   DATE_COMP              SALARY_AMOUNT
    12                      01-06-2019              25-09-2021                  22-02-2020              24.38
    12                      16-07-2018              31-05-2019                  22-02-2020              23.5

我创建了一个查询以从 table、comp_sal -

中获取 2 年的薪水
select * from 
(
select person_number,
salary_amount,
 to_char(date_from,'dd-mm-yyyy') date_From ,
to_char(date_to,'dd-mm-yyyy') date_to,
 ((Select to_char(sysdate,'dd-mm-')||To_char(Add_months(SYSDATE, -24), 'yyyy') from dual)) date_comp
 
 from comp_sal
 )
  where Date_comp between DATE_fROM and date_to

但是我得到了上面的两行,而不仅仅是第一行,因为 22-02-2020 在 01-06-2019 和 25-09-2021 之间。 即使在 DATE_fROM 和 date_to 条件

之间添加 Date_comp 之后,我也在输出中得到 16-07-2018 和 31-05-2019 行

你没有回答我作为评论提出的问题,所以 - 这是一个演示。我怀疑您实际上将日期存储为字符串并得到了错误的结果:

SQL> with comp_sal (person_number, date_from, date_To, date_comp, salary_amount) as
  2    (select '12', '01-06-2019', '25-09-2021', '22-02-2020', 24.38 from dual union all
  3     select '12', '16-07-2018', '31-05-2019', '22-02-2020', 23.5  from dual
  4    )
  5  select *
  6  from comp_sal
  7  where date_comp between date_from and date_to;

PE DATE_FROM  DATE_TO    DATE_COMP  SALARY_AMOUNT
-- ---------- ---------- ---------- -------------
12 01-06-2019 25-09-2021 22-02-2020         24,38
12 16-07-2018 31-05-2019 22-02-2020          23,5

SQL>

如果您将字符串转换为日期 - 使用带有适当格式掩码的 TO_DATE 函数 - 那么您会得到正确的结果:

SQL> with comp_sal (person_number, date_from, date_To, date_comp, salary_amount) as
  2    (select '12', '01-06-2019', '25-09-2021', '22-02-2020', 24.38 from dual union all
  3     select '12', '16-07-2018', '31-05-2019', '22-02-2020', 23.5  from dual
  4    )
  5  select *
  6  from comp_sal
  7  where to_date(date_comp, 'dd-mm-yyyy') between to_date(date_from, 'dd-mm-yyyy')
  8                                             and to_date(date_to, 'dd-mm-yyyy');

PE DATE_FROM  DATE_TO    DATE_COMP  SALARY_AMOUNT
-- ---------- ---------- ---------- -------------
12 01-06-2019 25-09-2021 22-02-2020         24,38

SQL>

即使您已(正确地)将列定义为日期,您的查询也会得到该结果,因为您使用的是将它们转换为字符串然后进行比较的子查询。

如果您将所有内容都保留为日期 int 子查询并仅在外部查询的最后时刻转换为字符串,仅供显示:

select person_number,
  to_char(date_from, 'dd-mm-yyyy') as date_from,
  to_char(date_to, 'dd-mm-yyyy') as date_to,
  to_char(date_comp, 'dd-mm-yyyy') as date_comp,
  salary_amount
from (
  select person_number,
    date_from,
    date_to,
    add_months(trunc(sysdate), -24) as date_comp,
    salary_amount
  from comp_sal
)
where date_comp between date_from and date_to

...那么它只会找到您期望的单行。

您也可以避免针对真实 table 的子查询,而是从 cross-joined/applied 到真实 table 的单独查询中获取 date_comp

select person_number,
  to_char(cs.date_from, 'dd-mm-yyyy') as date_from,
  to_char(cs.date_to, 'dd-mm-yyyy') as date_to,
  to_char(t.date_comp, 'dd-mm-yyyy') as date_comp,
  salary_amount
from comp_sal cs
cross apply (select add_months(trunc(sysdate), -24) as date_comp from dual) t
where t.date_comp between cs.date_from and cs.date_to

无论哪种方式,将样本数据作为日期,您都会得到相同的结果:

PERSON_NUMBER DATE_FROM DATE_TO DATE_COMP SALARY_AMOUNT
12 01-06-2019 25-09-2021 22-02-2020 24.38

db<>fiddle