在Oralce中减去日期

时间:2017-08-15 21:15:40

标签: oracle plsql

我正在尝试使用以下代码创建表。但是,我有问题减去日期作为列之一(是的,我已经尝试在网站上研究这个问题,但我仍然有问题)。

每当我运行此代码时,都会收到以下错误:“AM / A.M。或PM / P.M。需要。” “AM”已经包括在内,所以我不确定我哪里出错了。有什么想法吗?

   CREATE TABLE FINAL
AS
    select 
        policy_id, 
        ECY, 
        TO_DATE(end_dt,'DD-MON-YY HH:MI:SS AM') - TO_DATE(start_dt,'DD-MON-YY HH:MI:SS AM') maxdays, 
        start_dt, 
        end_dt,
        cancellation_date,
        County
    from counttable
    where (Cancellation_Date is null or Cancellation_Date > &enddate)
    and ECY > 0;

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

如果您的start_dt和end_dt确实是VARCHAR列,那么我愿意打赌您已经参考了一行或多行来破坏了您的日期格式字符串

运行这两个查询,看看我的意思:

--works ok
select to_date('01-jan-1901 12:34 pm', 'dd-mon-yyyy hh:mi am') from dual

--complains "am/pm required"
select to_date('01-jan-1901 12:34:56 pm', 'dd-mon-yyyy hh:mi am') from dual

简而言之,它并没有抱怨"您的日期格式字符串缺少AM / PM字段",它正在抱怨"在尝试将表格数据解析为您提供的格式时,我遇到的事情不是" AM"或" PM"在你的日期格式字符串答应我的数据中,我会找到AM / A.M./PM / P.M。"

在我上面的测试查询中,例如,"表格中的数据"在时间结束时包含:56秒,但是我的日期格式字符串向oracle承诺,一旦完成解析分钟,它就会在数据中找到AM / PM。基本上,我的日期格式字符串撒谎。

确保您的日期格式字符串准确描述了字符串在每个表行中表示日期的方式。即使是一百万行中有一些违反格式的损坏数据,也会停止查询。这就是将日期存储为日期时间类型而不是varchar

的原因

如果您的列不是VARCHAR,那么在TO_DATE()开始工作之前,会继续对varchar进行一些隐式转换。如果您的列已经是日期,则不要使用它们。如果他们不是VARCHAR之外的东西(比如他们是1970年1月1日午夜之后的分钟数的INT),则相应地对待他们 - >通过其表示所需的任何方式将它们转换为日期