В чем разница между TO_DATE('21-09-1989','ДД-ММ-ГГ') и TO_DATE ('21-09-89', 'ДД-ММ-ГГ')?

Ниже запрос возвращает результат:

SELECT * 
FROM EMPLOYEES 
WHERE HIRE_DATE = TO_DATE('21-09-1989','DD-MM-YY');

где, как будто я меняю дату с 21-09-1989 на 21-09-89, ничего не возвращает.

SELECT * 
FROM EMPLOYEES 
WHERE HIRE_DATE = TO_DATE('21-09-89','DD-MM-YY');

В чем проблема?

3 ответа

Решение

Если вы используете YY в качестве года возвращается год текущего столетия, т.е. 2000-2099. В твоем случае-- 2089

Если вы используете YYYYзатем возвращается точный год. -- в твоем случае1989

Если вы используете RR затем год, который находится между 1950-2049возвращается. -- в твоем случае1989

Так

TO_DATE('21-09-1989','DD-MM-YY') --> 21-09-1989
-- oracle is smart to detect the given format as YYYY

TO_DATE('21-09-89','DD-MM-YY') --> 21-09-2089
-- as 2089 is between 2000-2099

TO_DATE('21-09-89','DD-MM-RR') --> 21-09-1989
-- as 1989 is between 1950-2049
TO_DATE('21-09-89','DD-MM-YY')

оценивается до 21 сентября 2089 г.

Как уже объяснялось в другом ответе о разнице между 'YY' а также 'YYYY'формат и его последствия. Вы можете легко избежать проблем, используя литерал ANSI DATE:

DATE '1989-09-21'

Литерал даты ANSI не содержит временной части и должен быть указан именно в этом формате. ('YYYY-MM-DD').

Также, HIRE_DATE- это тип данных DATE, который также имеет временную часть. Следовательно, ваше условие WHERE может не возвращать правильные значения:

WHERE HIRE_DATE = TO_DATE('21-09-1989','DD-MM-YY')

Чтобы удалить часть времени, вы должны использовать TRUNC для сравнения только с частью даты:

WHERE TRUNC(HIRE_DATE) = DATE '1989-09-21'
Другие вопросы по тегам