我在航空环境中工作,我必须比较两个值。 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
答案 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
谢谢大家!