to_char и to_date возвращают разные выходные данные
Я использую ниже запросы.
select sysdate from dual where to_char(sysdate,'DD-MM-YY')='28-MAY-13';
и вывод равен нулю. Но для запроса ниже выводится текущая дата.
select sysdate from dual where to_date(sysdate,'DD-MM-YY')= to_date('28-MAY-13','DD-MM-YY');
Почему функция to_char не может вернуть sysdate?
Разве мы не используем to_char для сравнения даты?
2 ответа
Попробуйте формат "DD-MON-YY" для сопоставления с "28-MAY-13"
"ММ" соответствует номеру месяца.
РЕДАКТИРОВАТЬ: SQL может выяснить, использовать правильный формат в to_date; он автоматически преобразует "DD-MM-YY" в "DD-MON-YY", когда видит, что входная строка имеет формат "28-MAY-13". однако, to_char не делает никаких предположений; поэтому он пытается сравнить "28-05-13" с "28-мая-13"
EDIT2: добавлено, что DUAL может возвращать только одну строку; так что вы могли бы просто сделать
SELECT sysdate FROM DUAL
У Дана Брачука есть несколько хороших моментов относительно сравнения дат; по возможности сохраняйте их в формате даты. Используйте trunc(DateTime), если важен только день, а не время; это обычно необходимо, если вы используете '=', но часто не обязательно, если вы проверяете наличие МЕЖДУ
Относительно: разве мы не используем to_char для сравнения даты?
Нет, мы не должны. Мы должны использовать to_char для форматирования даты в целях отображения. Если у вас есть другая причина, это, вероятно, плохая идея.
Сравнивая даты в оракуле, имейте в виду, что даты оракула включают времена. Лучший способ узнать, попадает ли значение в диапазон дат:
where myDateField >= date1
and myDateField < the day after date2
Когда ваш диапазон дат сегодня, сделайте это:
where myDateField >= trunc(sysdate)
and myDateField < trunc(sysdate + 1 )
Если вы хотите сравнить его с входным параметром, который является строкой, используйте to_date для преобразования строки в дату, а затем реализуйте ту же общую идею.