Функция ToDate возвращается не так, как ожидалось

#oracle

#Oracle

Вопрос:

Я фильтрую базу данных по ETD_Date, которая имеет тип даты. И мой фильтр

 AND OMB.ETD_DATE BETWEEN TO_DATE('3/11/2019 12:00:00','MM/DD/YYYY 
  HH:MI:SS AM') AND TO_DATE('3/11/2019 11:59:59','MM/DD/YYYY HH:MI:SS PM')
  

она возвращает мне нулевые строки, но когда я проверил свою таблицу in, у меня есть
«3/11/2019 17:00:00 вечера» и «3/11/2019 7: 45:00 вечера» . Я попытался обменять AM / PM как

  OMB.ETD_DATE BETWEEN TO_DATE('3/11/2019 12:00:00','MM/DD/YYYY HH:MI:SS PM') AND TO_DATE('3/11/2019 11:59:59','MM/DD/YYYY HH:MI:SS AM') 
  

купить это не сработает. каким должен быть мой фильтр, чтобы я получил ожидаемый результат.

Комментарии:

1. Я предпочитаю избегать использования формата am / pm .. просто используйте формат 24 часа .. это устраняет всю неопределенность 🙂 to_date(‘3/11/2019 12:00:00′,’ ММ / ДД / ГГГГ ЧЧ24: MI: SS’) и to_date(‘3/11/2019 23:59:59′,’ ММ / ДД / ГГГГ ЧЧ24: MI: SS’) попробуйте это и посмотрите, работает ли это лучше?

Ответ №1:

AM Или PM Также должно появиться в строке даты. Как в

 AND OMB.ETD_DATE BETWEEN TO_DATE('3/11/2019 12:00:00 AM','MM/DD/YYYY HH:MI:SS AM')
                     AND TO_DATE('3/11/2019 11:59:59 PM','MM/DD/YYYY HH:MI:SS PM')
  

Приведенный выше совет привыкнуть к использованию 24-часовых часов также является тем, что вам следует сделать. Итак, попробуйте:

 AND OMB.ETD_DATE BETWEEN TO_DATE('3/11/2019 00:00:00','MM/DD/YYYY HH24:MI:SS')
                     AND TO_DATE('3/11/2019 23:59:59','MM/DD/YYYY HH24:MI:SS')
  

Или вы можете просто игнорировать время по большей части:

 AND OMB.ETD_DATE BETWEEN TO_DATE('3/11/2019','MM/DD/YYYY')
                     AND TO_DATE('3/12/2019','MM/DD/YYYY') - INTERVAL '1' SECOND
  

Последняя версия работает, потому что временная часть a по DATE умолчанию равна 00:00:00 , если она не указана, и, вычитая одну секунду из полуночи, вы получаете 23:59:59 .

Желаю удачи.