0

我正在使用以下查询。

select sysdate from dual where to_char(sysdate,'DD-MM-YY')='28-MAY-13';

并且输出为空。但是对于以下查询,输出是当前日期。

select sysdate from dual where to_date(sysdate,'DD-MM-YY')= to_date('28-MAY-13','DD-MM-YY');

为什么 to_char 函数不能返回 sysdate?

我们不应该使用 to_char 来比较日期吗?

4

2 回答 2

4

关于:我们不应该使用 to_char 来比较日期吗?

不,我们不应该。我们应该使用 to_char 格式化日期以用于显示目的。如果您有任何其他原因,那可能是个坏主意。

在 oracle 中比较日期时,请记住 oracle 日期包括时间。查看值是否在日期范围内的最佳方法是:

where myDateField >= date1
and myDateField < the day after date2

当您的日期范围是今天时,请执行以下操作:

where myDateField >= trunc(sysdate)
and myDateField < trunc(sysdate + 1 )

如果要将其与作为字符串的输入参数进行比较,请使用 to_date 将字符串转换为日期,然后实现相同的一般思想。

于 2013-05-28T18:56:21.667 回答
3

尝试“DD-MON-YY”格式映射到“28-MAY-13”

'MM' 映射到月份编号。

编辑:SQL 可以找出在 to_date 中使用正确的格式;当它看到输入字符串为“28-MAY-13”格式时,它会自动将“DD-MM-YY”转换为“DD-MON-YY”。然而,to_char 不做任何假设;所以它试图将 '28-05-13' 与 '28-MAY-13' 进行比较

EDIT2:一个补充说明是 DUAL 只能返回一行;所以你可以做

 SELECT sysdate FROM DUAL

Dan Bracuk 关于日期比较有一些优点。尽可能将它们保留为日期格式。如果只有日期而不是时间,请使用 trunc(DateTime) ;如果您使用“=”,这通常是必要的,但如果您确实检查 BETWEEN,则通常不需要

于 2013-05-28T15:56:10.307 回答