4

下面的查询返回结果:

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');

这里有什么问题?

4

3 回答 3

8

如果您将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
于 2020-04-12T06:44:24.003 回答
3
TO_DATE('21-09-89','DD-MM-YY')

评估为 2089 年 9 月 21 日

于 2020-04-12T06:44:45.177 回答
0

正如其他答案中已经解释的那样,格式之间的区别'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'
于 2020-04-12T10:47:45.110 回答