在oracle中比较两个日期

Posted

技术标签:

【中文标题】在oracle中比较两个日期【英文标题】:compare two dates in oracle 【发布时间】:2013-09-27 05:19:48 【问题描述】:

(我正在使用 Oracle10g & Java(JDBC & Servlets))

以下是我比较 ETIMEsysdate 的查询。

如果 ETIME+7days 大于 sysdate 那么我想选择 Y 并且如果 ETIME+7days 小于 sysdate 我要选择N

select USER, 
       CASE WHEN to_date(ETIME+7, 'YYYY-MON-DD HH24:MI:SS') >= to_date(sysdate, 'YYYY-MON-DD HH24:MI:SS')
            THEN 'Y' ELSE 'N' END THE_TIME
from TABLE_NAME
where THE_KEY='123456789'

[注意:在THE_KEY 的数据库中ETIME 的值为27/09/2013]

以上查询今天返回N。几天前它返回Y。所以我认为我对两个日期的比较是错误的。

任何建议将不胜感激。

【问题讨论】:

【参考方案1】:

您不必使用to_date 函数。直接比较日期:

select USER, 
       CASE WHEN ETIME+7 >= sysdate
            THEN 'Y' ELSE 'N' END THE_TIME
from TABLE_NAME
where THE_KEY='123456789'

您可以检查原始查询出错的原因。运行以下查询,看看to_date 函数如何转换日期。

select
  sysdate,
  to_date(sysdate, 'YYYY-MON-DD HH24:MI:SS')
from dual

to_date 函数的第一个参数应该是日期字符串,如'2013-SEP-27 05:29:26',而不是日期本身。

【讨论】:

【参考方案2】:

这样试试,

with t(user, etime, the_key) AS 
(
SELECT 1, SYSDATE - 1, '12345678' FROM dual
UNION
SELECT 2, SYSDATE - 8, '12345678' FROM dual
)
SELECT user, CASE WHEN ETIME + 7 >= sysdate
               THEN 'Y' 
             ELSE 'N' END THE_TIME
FROM t
where THE_KEY='12345678';

【讨论】:

【参考方案3】:

除了使用to_date() 之外,我没有发现任何问题。这里唯一的可能是 ETIME 在一段时间内保持不变,从您的前几天到今天。

看看这个例子:-

几天前(2013 年 9 月 23 日)

ETIME = 2013 年 9 月 19 日

ETIME + 7 = 2013 年 9 月 26 日

因此,您的结果是 Y(因为 sysdate 小于 ETIME + 7)

今天(2013 年 9 月 27 日)

ETIME = 2013 年 9 月 19 日 // 相同

ETIME + 7 = 2013 年 9 月 26 日 // 相同

因此,您的结果是 N(因为您的 sysdate 大于 ETIME + 7)

【讨论】:

以上是关于在oracle中比较两个日期的主要内容,如果未能解决你的问题,请参考以下文章

Oracle两个日期类型字段怎么比较大小

如果仅按日和月将两个日期与 Oracle SQL 进行比较

比较两个日期Oracle的多案例

Oracle两个日期类型字段怎么比较大小

oracle数据库里两个字符型的日期数据怎样比较?

有没有更好的方法来编写这个处理比较两个不同列中的日期的 Oracle SQL?