【问题标题】:to_char and to_date are returning different outputto_char 和 to_date 返回不同的输出
【发布时间】:2013-05-28 15:51:24
【问题描述】:

我正在使用以下查询。

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

【问题讨论】:

  • 请注意,to_date(sysdate,'DD-MM-YY') 将日期 (sysdate) 隐式转换为字符串,即 to_date(to_char(sysdate),'DD-MM-YY')

标签: sql oracle to-date to-char


【解决方案1】:

关于:我们不应该使用 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将字符串转换为日期,然后实现同样的大致思路。

【讨论】:

    【解决方案2】:

    尝试使用“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 则通常不需要

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-13
      • 1970-01-01
      • 2018-06-17
      • 1970-01-01
      • 1970-01-01
      • 2015-12-20
      • 2019-06-17
      • 1970-01-01
      相关资源
      最近更新 更多