比较两个日期作为整数,Oracle SQL

时间:2011-10-12 20:20:17

标签: sql oracle

我正在寻找一种方法来比较SQL查询中的两个日期,其中日期作为整数存储在不同的列中,分别为yearmonthday。 (请注意,这不是我的选择!)例如,如果日期是2011年10月12日,则您的值分别为20111112

我最初的尝试是以算术方式进行;然而,当我意识到我不知道两个日期中的哪一个会更大时,这种情况就会失败。我试图在SQL中查看日期支持,但遗憾的是我还没有找到任何可以帮助我的东西。我发现了一些方法可以转换为其他版本的日期格式,例如MySQL,但没有任何方法可以用于Oracle的实现。

2 个答案:

答案 0 :(得分:3)

假设您的列在表xyz中被称为日,星期一和年份

select to_date(to_char(day)||to_char(mon)||to_char(year),'ddmmyyyy')
from xyz

会将数字转换为日期。然后你可以按照自己的意愿操纵它们。

在回复评论时添加:

排除不能转换为日期的dd mon和yyyy组合的最简单方法可能是在pl / sql中执行to_date,然后使用invalid_date异常处理程序来捕获问题组合。如果你必须使用sql,我想你可以尝试在执行to_date之前排除无效组合,所以像

SELECT to_date(to_char(day)||to_char(mon)||to_char(year),'ddmmyyyy')
FROM   xyz
WHERE  to_char(day)||to_char(mon) NOT IN ('3002','3102','3104','3106','3109','3111')
AND    (to_char(day)||to_char(mon) != '2902'
    OR to_char(year) IN (2008,2004,1996,1992,1988,...))

...需要保留与数据一样多的闰年。

答案 1 :(得分:0)

  

在年份不一定是四位数的情况下,这会起作用吗?

如果您有两个角色年份(1998年为“98”,2002年为“02”),那么您可以使用RR年份格式,这将智能地转换它们。如果两种类型恰好混合在一起,它也将正确处理四位数年份。

的示例:

从双重选择to_date(to_char(02)||' - '|| to_char(12)||' - '|| to_char(30),'RR-MM-DD');

从双重选择to_date(to_char(1998)||' - '|| to_char(12)||' - '|| to_char(30),'RR-MM-DD');