to_char和to_date返回不同​​的输出

时间:2013-05-28 15:51:25

标签: sql oracle to-date to-char

我正在使用以下查询。

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比较日期吗?

2 个答案:

答案 0 :(得分: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将字符串转换为日期,然后实现相同的一般概念。

答案 1 :(得分: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

则通常不需要