Вы получаете неправильные записи, потому что вы конвертируете даты в строку.Это означает, что запрос использует семантику строк при сравнении.В качестве строки '15-12-2999'
и '15-05-2000
находятся между '10-09-2018'
и '30-09-2018'
, поскольку '15'
имеет более высокое значение ASCII, чем '10'
, и более низкое значение ASCII, чем '30'
.
.Решение довольно простое: используйте типы данных date для сравнения.
select * from sales
where txn_date between date '2018-09-10' and date '2018-09-30'
Если TXN_DATE имеет элемент времени, вы можете изменить запрос на
select * from sales
where txn_date >= date '2018-09-10'
and txn_date < date '2018-10-01'
В противном случае вы не будете получать записидля транзакций, совершенных после полуночи 30 сентября.
В качестве альтернативы вы можете удалить элемент времени, укоротив дату:
select * from sales
where trunc(txn_date) between date '2018-09-10' and date '2018-09-30'