2014-01-09 62 views
0

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

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

当应用TO_DATE,原来char值转换为:2013年12月25日12时五十四分00秒

,但我得到了以下错误:

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

+4

你能告诉我们原始值吗?我想当它是25.12.2013 12:54:00,格式不反映文本的价值。 –

+0

如果您可以向我们展示一些示例数据,我们可以指出'to_date'函数出错的地方。 – Rachcha

+0

向我们展示了'从双重选择aibt的结果;' – SriniV

回答

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

你显然有一些数据,不能与TO_DATE转换为适当的日期。请随意指责您的OEM未定义约束条件或以其他方式防止发生这种情况。

虽然他都绕来解决他的问题,你可以使用它作为一个解决办法:

WHERE aibt > sibt 
0

有没有在数据中的一些问题。也感谢Twinkles的贡献。我没有想到这一点。任何人都可以解释如何比较两个char值的工作? 我在另一篇文章Oracle: how to add minutes to a timestamp?我用于构造比较答案(我真正需要的):

WHERE TO_DATE(AIBT, 'YYYYMMDDHH24MISS')> TO_DATE(SIBT, 'YYYYMMDDHH24MISS')+间隔“ 15'分钟

谢谢大家!