Выборка по первым трем буквам, разным датам рождения и дата в периоде
Необходимо найти по фамилии - по первым 3-м буквам, дата рождения должны быть не равны, дата F7 должна быть в периоде между F6 и F7.
Tаблица:
create table SEARCH (
F1 VARCHAR2(1000),
F2 VARCHAR2(1000),
F3 VARCHAR2(1000),
F4 VARCHAR2(1000),
F5 VARCHAR2(1000),
F6 VARCHAR2(1000),
F7 VARCHAR2(1000),
F8 VARCHAR2(1000)
)
Данные таблицы:
F1 F2 F3 F4 F5 F6 F7 F8
115 ИВАНОВ ИВАН ИВАНОВИЧ 03.02.1961 04.04.2020 17.04.2020 G12
115 ИВАНОВА ЗИНА ИВАНОВНА 30.07.1989 04.04.2020 17.04.2020 K14
110 ПЕТРОВ ПЕТР ИВАНОВИЧ 28.08.1984 23.04.2020 27.04.2020 Z14
110 СИДОРОВ ПЕТР ИВАНОВИЧ 28.08.1955 23.05.2020 27.05.2020 Z16
Нужен такой результат:
F1 F2 F3 F4 F5 F6 F7 F8
115 ИВАНОВ ИВАН ИВАНОВИЧ 03.02.1961 04.04.2020 17.04.2020 G12
115 ИВАНОВА ЗИНА ИВАНОВНА 30.07.1989 04.04.2020 17.04.2020 K14
Ответы (1 шт):
Автор решения: 0xdb
→ Ссылка
Дело в том, что даты в символьном виде можно сравнить на равенство или неравенство, но сравнение на больше-меньше даст скорее всего неверный результат, так как они сравниваются лексикографически, например, 01.01.2021 меньше чем 31.12.2020.
Лучше их коннвертировать в тип DATE до операции сравнения:
select *
from search s1
where exists (
select 1
from search s2
where substr (s2.f2, 1, 3) = substr (s1.f2, 1, 3)
and s2.f5 != s1.f5
and to_date (s2.f7, 'dd.mm.yyyy') between to_date (s1.f6, 'dd.mm.yyyy')
and to_date (s1.f7, 'dd.mm.yyyy')
)
Результат:
F1 F2 F3 F4 F5 F6 F7 F8
--- -------- -------- -------- ------------ ------------ ------------ ---
115 ИВАНОВ ИВАН ИВАНОВИЧ 03.02.1961 04.04.2020 17.04.2020 G12
115 ИВАНОВА ЗИНА ИВАНОВНА 30.07.1989 04.04.2020 17.04.2020 K14