В чем разница между TO_DATE ('21 -09-1989 ',' DD-MM-YY ') и TO_DATE ('21 -09-89', 'DD-MM-YY')? - PullRequest
4 голосов
/ 12 апреля 2020

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

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 ]

8 голосов
/ 12 апреля 2020

Если вы используете 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
3 голосов
/ 12 апреля 2020
TO_DATE('21-09-89','DD-MM-YY')

оценка до 21 сентября 2089

0 голосов
/ 12 апреля 2020

Как уже объяснялось в другом ответе о разнице между форматами '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')

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

WHERE TRUNC(HIRE_DATE) = DATE '1989-09-21'
...