Получить данные между двумя датами - PullRequest
0 голосов
/ 16 ноября 2018

Я хочу знать, как получать данные между двумя датами, используя SQL-запросы. В моей таблице формат даты dd/mm/yyyy hh:mm:ss am/pm.

В соответствии с этим форматом дат мне нужно получить данные. Столбец типа DATE.

Я пытался с запросом ниже

select * from sales 
where to_char(txn_date, 'dd-mm-yyyy' ) 
between '10-09-2018' and '30-09-2018'

Я получаю неправильные записи. Почему?

Ответы [ 4 ]

0 голосов
/ 12 декабря 2018

Наконец я получил ответ на этот вопрос Выберите * из продаж, где txn_date между to_date ('01 -10-2018 00:00:00 ',' DD-MM-YYYY HH24: MI: SS ') и to_date ('31 -10-2018 23:59:59' , 'ДД-ММ-ГГГГ ЧЧ24: МИ: СС')

0 голосов
/ 16 ноября 2018

Вы получаете неправильные записи, потому что вы конвертируете даты в строку.Это означает, что запрос использует семантику строк при сравнении.В качестве строки '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'
0 голосов
/ 16 ноября 2018

выберите * из продаж, где усечение (txn_date) между '10 -09-2018 'и '30 -09-2018' Если у вас есть формат даты / времени, усечение исключит время в дате

0 голосов
/ 16 ноября 2018

Похоже, вы сохраняете метки времени как TEXT или VARCHAR в базе данных.Если это так, вы не можете.И это действительно плохой подход.Вместо этого, пожалуйста, используйте тип DATETIME, что позволяет вам использовать оператор BETWEEN.

Когда вы используете тип DATETIME, вы можете сделать

SELECT *
FROM sales
WHERE txn_date BETWEEN '2018-01-01 00:00:00' AND '2018-12-31 23:59:59'

, который будетпредоставить вам все данные за 2018 год и по-прежнему использовать ваши индексы

РЕДАКТИРОВАТЬ

Поскольку теперь вы сказали, что используете DATE в качестве данныхтипа, вы можете использовать то же решение, без времени.

SELECT *
FROM sales
WHERE txn_date BETWEEN '2018-01-01' AND '2018-12-31'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...