在oracle中比较两个日期
Posted
技术标签:
【中文标题】在oracle中比较两个日期【英文标题】:compare two dates in oracle 【发布时间】:2013-09-27 05:19:48 【问题描述】:(我正在使用 Oracle10g & Java(JDBC & Servlets))
以下是我比较 ETIME 和 sysdate 的查询。
如果 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中比较两个日期的主要内容,如果未能解决你的问题,请参考以下文章