В чем разница между 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'