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
我有一个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 |