У меня возникли проблемы при использовании функции Current_Date в простом запросе, и я не могу понять, почему. Я работаю в среде Oracle 12c с использованием Oracle SQL Developer 3.2.
Мой исходный запрос выглядит примерно так:
select * from Inventory where Placement_End_Dt >= Current_date
Вышеупомянутое работает нормально, за исключением того, что не собирает записи, где Placement_End_Dt сегодня (14th 18 мая).
Я попытался упростить запрос следующим образом, но это тоже ничего не возвращает
select * from Inventory where Placement_End_Dt = Current_date
Однако, когда я применяю форматирование даты следующим образом, оно работает:
select * from Inventory where to_char(Placement_End_Dt, 'DD-MM-YYYY') = to_char(Current_date, 'DD-MM-YYYY')
Затем я пытаюсь расширить это, чтобы вернуться к моему исходному запросу, чтобы выбрать все записи с датой окончания, начиная с сегодняшнего дня:
select * from Inventory where to_char(Placement_End_Dt, 'DD-MM-YYYY') => to_char(Current_date, 'DD-MM-YYYY')
Это бросается в глаза, потому что выбираются записи с прошлым, настоящим и будущим Placement_End_Dt!
Столбцы Placement_End_Dt определены как тип данных Oracle DATE.
Был бы признателен за информацию о том, как я могу заставить этот запрос работать.


При использовании to_char вы сравниваете строки.
to_char(date '2000-01-20', 'DD-MM-YYYY') > to_char(date '2018-05-14', 'DD-MM-YYYY')
потому что «20 -01-2000» больше, чем «14 -05-2018», из-за первых букв в строках: «2»> «1».
А CURRENT_DATE почти никогда не используется, потому что он использует время вашего компьютера, а не время базы данных, поэтому вы легко можете отдохнуть на несколько часов. Вместо этого используйте SYSDATE.
Попробуйте это, он вернет строки для настоящих и будущих дней.
select * from Inventory where trunc(Placement_End_Dt) >= trunc(sysdate);
Я бы предложил использовать этот запрос
select * from Inventory where trunc(Placement_End_Dt) = trunc(sysdate);
Столбцы Oracle Date также хранят метку времени по умолчанию, поэтому, если записи не совпадают с точностью до секунды, они не будут совпадать. Когда вы используете trunc () в столбце даты, он обрезает метку времени и оставляет только дату.
Думаю, это можно упростить до
where placement_end_dt >= trunc(sysdate);