如何根据日期和时间比较Oracle中的两个日期值

时间:2014-01-09 12:12:45

标签: sql oracle

我在航空环境中工作,我必须比较两个值。 OEM的所有智慧都将所有日期时间值存储在char中。要比较的值称为aibt和sibt 作为where子句的一部分,我需要检查aibt是否大于sibt。所以这就是我所做的:

To_Date(aibt,'YYYYMMDDHH24MISS') > To_Date(sibt,'YYYYMMDDHH24MISS')

申请to_date时,原始字符值将转换为:25.12.2013 12:54:00

但是我收到以下错误:

ORA-01841 :(完整)年份必须介于-4713和+9999之间,而不是0

3 个答案:

答案 0 :(得分:1)

似乎是您数据中的错误。先试试这个:

Select to_date(aibt,'YYYYMMDDHH24MISS') from your_table

Select to_date(sibt,'YYYYMMDDHH24MISS') from your_table

检查列中是否有不正确的数据。

当您在列中找到有问题的数据时,您可以找到正在弄乱这些数据的数据:

select *
  from yourtable
 where not regexp_like(aibdt, '^[[:digit:]]+$') 
  OR length(aibdt)<4 OR 
   substr(aibdt,1,4)<0 

答案 1 :(得分:1)

您显然有一些数据无法使用TO_DATE转换为正确的日期。您可以随意指责您的OEM没有定义约束或以其他方式防止这种情况发生。

当他解决问题时,您可以将其用作解决方法:

WHERE aibt > sibt

答案 2 :(得分:0)

数据存在一些问题。也感谢Twinkles为您的贡献。我没想到这一点。谁能解释比较两个char值的工作原理? 我在用于构建比较的另一篇文章Oracle: how to add minutes to a timestamp?中得到了答案(我真正需要的):

WHERE To_Date(aibt,'YYYYMMDDHH24MISS')&gt; To_Date(sibt,'YYYYMMDDHH24MISS')+ INTERVAL'15'MINUTE

谢谢大家!