Как включить TIME в мой SQL-запрос для поиска данных между двумя датами? - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь получить данные между двумя датами, которые должны включать секунды

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

where h.creation_time >= date '2017-01-01'
and h.CLOSED_TIME >= date '2018-12-16' and h.CLOSED_TIME <= date '2018-12-17' 

Вот что я пытался изменить код:

where (h.creation_time >= date '2017-01-01')
and (h.CLOSED_TIME between '2018-12-16 18:19:00' and '2018-12-16 18:20:00')

Я должен ожидать результаты всего между 6: 19:00 и 18:20 (одна минута).Вместо этого он выдает ошибку:

ORA-01861: литерал не соответствует строке формата

Ответы [ 3 ]

0 голосов
/ 03 января 2019

все с 6:19 до 18:20 (минутный интервал)

Представленная здесь проблема не только техническая, но и языковая.Слово «между» может иметь несколько тонких отличий, таких как вождение между воротами (то есть, надеюсь, что автомобиль не врезается ни в одну из сторон, и поэтому в него не входит столб), либо полет между Лондоном иПариж , в который включены оба города, в противном случае вы не достигли конечного пункта.

В стандартах SQL используется последний подход между ними, он определяется как включающий обе конечные точки.Это потенциальная проблема для диапазонов даты / времени, так как это может привести к двойному счету конечных точек.Как @mathguy указывает в своем превосходном комментарии к этому вопросу, более строгий подход состоит в том, чтобы избегать использования между и явно определять диапазон следующим образом:

WHERE h.creation_time >= to_date('2017-01-01', 'YYYY-MM-DD')
AND h.closed_time >= to_date('2018-12-16 18:19:00', 'YYYY-MM-DD HH24:MI:SS')
AND h.closed_time  < to_date('2018-12-16 18:20:00', 'YYYY-MM-DD HH24:MI:SS')

ЕСЛИ столбец closed_time являетсяdate тип данных используется to_date()

ЕСЛИ столбец closed_time имеет тип данных timestamp, используйте to_timestamp() вместо.

0 голосов
/ 03 января 2019

Литерал отметки времени начинается с ключевого слова TIMESTAMP (точно так же, как литерал даты начинается с DATE):

where h.creation_time >= date '2017-01-01'
and h.closed_time between timestamp '2018-12-16 18:19:00' and timestamp '2018-12-16 18:20:00'

Чтобы учесть доли секунд, вы не должны использовать BETWEEN, но:

where h.creation_time >= date '2017-01-01'
and h.closed_time >= timestamp '2018-12-16 18:19:00' 
and h.closed_time < timestamp '2018-12-16 18:20:00'
0 голосов
/ 03 января 2019

Попробуйте преобразовать их явно с помощью to_date().

WHERE h.creation_time >= to_date('2017-01-01', 'YYYY-MM-DD')
      AND h.closed_time BETWEEN to_date('2018-12-16 18:19:00', 'YYYY-MM-DD HH24:MI:SS')
                                AND to_date('2018-12-16 18:20:00', 'YYYY-MM-DD HH24:MI:SS')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...