2015-09-16 3 views
2

У меня возникла проблема с выбором элементов в течение заданного интервала времени. Для иллюстрации проблемы рассмотрим таблицу Orders со следующими полями:Выбор строк для заданного интервала времени

- id 
- order_date 
- order_time 
- details 

т.д.

У меня есть order_date в формате MJD и order_time в секундах. Например., ORDER_DATE = 57281 (в MJD) // 16-Sep-2015 order_time = 32400 (в секундах) // 9:00 утра

SELECT * FROM 
(SELECT Orders.id, Orders.order_date date, 
Orders.order_time time FROM Orders 
WHERE Orders.date<=endDate and Orders.order_time < endTime) 
WHERE date>=startDate and time > startTime 

Это, кажется, не возвращать правильные значения, так как не способный ассоциировать следующую проверку времени только когда дата даты начала.

WHERE date>=startDate and time > startTime 

Что здесь может быть отсутствует? Существуют ли другие простые способы обработки таких запросов? Пожалуйста, предложите.

+2

Какая СУБД вы используете? Postgres? Oracle? Даты не имеют никакого «формата» в базе данных SQL, формат применяется только тогда, когда вы _display_ их. –

+0

Я использую базу данных SQLite, используемую для хранения данных на небольших устройствах ... в настоящее время дата и время хранятся с типом INTEGER и без определенного формата. Дата INTEGER представляет дату MJD. Время INTEGER представляет собой соответствующее число секунд. – Omkar

ответ

1

Первой даты и время новообращенной к объединенному значению даты и времени, а затем использовать только одно условие, вы можете использовать WHERE dateTime BETWEEN startDateTime AND endDateTime ,

Проблема заключается в том, что вы фильтруете уже записи с использованием первого условия, и это оставляет вас для второго условия только с моментами времени, которые имеют время, например. <9:00AM.

дату и время отдельно Сравнение, когда вы смотрите для значений даты и времени в пределах интервала, вводит в заблуждение, потому что, когда интервал '2015-09-16 12:00:00' - '2015-09-17 12:00:00' вы пропустите значения, как '2015-09-16 13:00:00', '2015-09-16 14:00:00' и т.д., потому что они имеют более высокое значение времени, чем endTime= '12:00:00'.

+0

Изменена таблица, чтобы иметь одно поле, представляющее дату и время. Теперь запрос довольно прост. Благодарю. – Omkar

0

Вы также можете попробовать этот вариант, он работал для меня.

Where 
    DATE(date) >= startDate 
    AND DATE(time) >= StartTime 

OrElse Вы можете использовать

Where 
    datetime(StartDate) <= now() 

Для более продвинутой помощи, пожалуйста, проверьте SQL