下面的查询返回结果:
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');
这里有什么问题?
如果您将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')
评估为 2089 年 9 月 21 日
正如其他答案中已经解释的那样,格式之间的区别'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'