Если вам нужны строки, если пользователь проходит через месяц и год, это должно помочь:
WITH your_table AS (SELECT 2018 YEAR, 'mar' mon, to_date('21/03/2018', 'dd/mm/yyyy') dt, 'bb2' org FROM dual UNION ALL
SELECT 2018 YEAR, 'mar' mon, to_date('19/03/2018', 'dd/mm/yyyy') dt, 'bbd' org FROM dual UNION ALL
SELECT 2018 YEAR, 'feb' mon, to_date('17/02/2018', 'dd/mm/yyyy') dt, 'bbc' org FROM dual UNION ALL
SELECT 2018 YEAR, 'feb' mon, to_date('15/02/2018', 'dd/mm/yyyy') dt, 'bba' org FROM dual UNION ALL
SELECT 2018 YEAR, 'jan' mon, to_date('15/01/2018', 'dd/mm/yyyy') dt, 'abb' org FROM dual UNION ALL
SELECT 2018 YEAR, 'jan' mon, to_date('13/01/2018', 'dd/mm/yyyy') dt, 'abc' org FROM dual)
-- end of sample data setup
SELECT *
FROM your_table
WHERE to_date(mon||'/'||YEAR, 'mon/yyyy', 'nls_date_language = english') <= to_date(:dt, 'mon/yyyy', 'nls_date_language = english');
: dt = апр / 2018
YEAR MON DT ORG
---------- --- ----------- ---
2018 mar 21/03/2018 bb2
2018 mar 19/03/2018 bbd
2018 feb 17/02/2018 bbc
2018 feb 15/02/2018 bba
2018 jan 15/01/2018 abb
2018 jan 13/01/2018 abc
:дт = март / 2018
YEAR MON DT ORG
---------- --- ----------- ---
2018 mar 21/03/2018 bb2
2018 mar 19/03/2018 bbd
2018 feb 17/02/2018 bbc
2018 feb 15/02/2018 bba
2018 jan 15/01/2018 abb
2018 jan 13/01/2018 abc
: дт = февраль / 2018
YEAR MON DT ORG
---------- --- ----------- ---
2018 feb 17/02/2018 bbc
2018 feb 15/02/2018 bba
2018 jan 15/01/2018 abb
2018 jan 13/01/2018 abc
: дт = январь / 2018
YEAR MON DT ORG
---------- --- ----------- ---
2018 jan 15/01/2018 abb
2018 jan 13/01/2018 abc
: дт = декабрь / 2017
no rows selected
Вам необходимо соответствующим образом изменить ввод;в своем запросе я предположил, что запрашиваемый месяц будет в формате mon/yyyy
;это может или не может иметь место.
Кроме того, поскольку мы используем mon
, я добавил третий необязательный параметр, чтобы убедиться, что мы запрашиваем правильный язык дат.Запрос не сработал бы, если бы язык клиента был французским, но язык данных - английский!
Наконец, это похоже на плохой дизайн.Вы можете легко изменить эту таблицу, чтобы иметь только столбец dt, и добавить виртуальные столбцы в таблицу для создания столбцов месяца и года (хотя я бы не разделял их; я просто сделал бы trunc(dt, 'mm')
и оставил бы его какдополнительный столбец даты. Более гибкий, IMO) и индексируйте виртуальный столбец (столбцы) соответственно.