我有一張桌子 comp_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
我創建了一個查詢來從表中獲取 2 年的薪水,comp_sal -
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 行
uj5u.com熱心網友回復:
你沒有回答我作為評論提出的問題,所以 - 這是一個演示。我懷疑您實際上將日期存盤為字串并得到錯誤的結果:
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>
uj5u.com熱心網友回復:
即使您(正確地)將列定義為日期,您的查詢也會得到該結果,因為您正在使用將它們轉換為字串然后比較它們的子查詢。
如果您將所有內容都保留為子查詢中的日期并僅在外部查詢的最后一刻轉換為字串,僅用于顯示:
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
...那么它只會找到您期望的單行。
您還可以避免針對真實表的子查詢,而是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<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/431094.html
