Вопрос

Я пишу 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 цифры будут представлять день в году). Хотя вы упомянули, что вы конвертируете строку, используя то, что кажется правильным способом интерпретации, я думаю, что это может быть источником проблемы (или, по крайней мере, объяснением различий ...).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top