Формат даты Oracle - странное поведение
Вопрос
Я пишу SQL-запрос для извлечения данных из таблицы между двумя датами. Я даю два входа, как показано. Я конвертирую дату TO_CHAR (DD / MON / YYYY)
.
1. StartDate > 01/SEP/2009
EndDate < 01/OCT/2009
2. StartDate > 01/SEP/2009
EndDate < 1/OCT/2009
Я не получил никакого результата для первого ввода. Когда я меняю его на второй, я получаю результат. В чем разница между 01 / OCT / 2009 & amp; 1 / OCT / 2009?
Решение
при сравнении дат вы всегда должны явно конвертировать обе стороны оператора в тип данных DATE . Предполагая, что StartDate и EndDate являются типом данных DATE, это будет работать:
StartDate > to_date('01/SEP/2009', 'dd/MON/yyyy')
AND EndDate < to_date('01/OCT/2009', 'dd/MON/yyyy')
В вашем случае, однако, полученный результат согласуется со сравнением VARCHAR. Вы сравниваете строки, и ОЧЕНЬ маловероятно, что вы получите правильный результат (поскольку месяцы, например, НЕ сортируются по алфавиту).
Если StartDate и EndDate действительно VARCHAR, вы должны явно их преобразовать:
to_date(StartDate, 'dd/MON/yyyy') > to_date('01/SEP/2009', 'dd/MON/yyyy')
AND to_date(EndDate, 'dd/MON/yyyy') < to_date('01/OCT/2009', 'dd/MON/yyyy')
Это действительно для всех версий Oracle.
Другие советы
Поскольку у меня нет доступного клиента Oracle для проверки моего ответа, я не уверен, но: в Oracle одна цифра в строке даты, представляющая день (D), используется для указания дня недели (понедельник- Воскресенье), в то время как 2 цифры используются для указания дня месяца (3 цифры будут представлять день в году). Хотя вы упомянули, что вы конвертируете строку, используя то, что кажется правильным способом интерпретации, я думаю, что это может быть источником проблемы (или, по крайней мере, объяснением различий ...). Р>