使用日期时出现ORA-01858错误

时间:2016-04-08 15:09:34

标签: sql oracle

我不是交易程序员,但我知道一些SQL。我只需要另外一些关注我的代码,因为我不确定为什么会收到此错误。

#boxLeft{
    position: relative;
}

img{
    position: absolute;
}

2 个答案:

答案 0 :(得分:3)

您正在尝试将ci.ci_create_date日期值与您的案例陈述产生的字符串进行比较,即1月,2月,3月或null。因此,您可以有效地进行比较:

ci.ci_create_date = to_date('January')

除非您的NLS_DATE_FORMAT是'月'并且您的语言是英语,将获得ORA-01858。您可以将其左侧转换为月份名称,但在任何格式模型中都没有年份,其中包含任何年份1月份的数据;如果可以避免,那么从表中转换数据的性能会更好。

它并不完全清楚你要尝试做什么,但由于子查询具有contact_interaction的独立视图且没有相关性,因此它可能无法做任何事情。无论如何都要尝试。

如果您正在尝试计算今年前三个月的数值,那么您可以这样做:

select count(1) AH 
from regmdr.contact_interaction ci 
join regmdr.source_data sd on ci.sd_id = sd.sd_id
join regmdr.account_contact ac on ci.acct_cont_id = ac.acct_cont_id
join regmdr.account acc on ac.acc_id = acc.acc_id
where sd.sd_user_type in ('1','2')
and sd.sd_origin_reference = 'www.alliancehealth.com' 
and ci.ci_create_date >= date '2016-01-01'
and ci.ci_create_date < date '2016-04-01'

哪个会给你一个号码。如果您希望按月将group by放在错误的位置,则可以添加

...
group by trunc(ci.ci_create_date, 'MM')

虽然你在选择列表中确实也需要它,因为结果集没有任何意义 - 所以你知道每个计数属于哪个月。

根据使用月份名称,您可能想要选择列表中的那些:

select to_char(trunc(ci.ci_created_date, 'MM'), 'Month') as month,
  count(1) as AH 
from regmdr.contact_interaction ci 
...
group by trunc(ci.ci_create_date, 'MM')

......但我现在推测的更多。另请注意,月份名称对您的NLS设置很敏感,尤其是NLS_DATE_LANGUAGE。你可以强制他们总是使用英语via the optional third argument to to_char(),例如

select to_char(trunc(ci.ci_created_date, 'MM'), 'Month', 'NLS_DATE_LANGUAGE=ENGLISH')
...

答案 1 :(得分:0)

为什么不选择:

select to_char(ci.ci_create_date, 'YYYY-MM') monthyear,
       count(1) AH
from regmdr.contact_interaction ci
join regmdr.source_data sd on ci.sd_id = sd.sd_id
join regmdr.account_contact ac on ci.acct_cont_id = ac.acct_cont_id
join regmdr.account acc on ac.acc_id = acc.acc_id
where sd.sd_user_type in ('1','2')
and sd.sd_origin_reference = 'www.alliancehealth.com'
and to_char(ci.ci_create_date, 'MON' in ('JAN', 'FEB', 'MAR')
group by to_char(ci.ci_create_date, 'yyyy-mm';

如果您只对计数感兴趣(没有上下文),请将其包装在外部的select语句中:

select AH
from (select to_char(ci.ci_create_date, 'YYYY-MM') monthyear,
            count(1) AH 
      from regmdr.contact_interaction ci
      join regmdr.source_data sd on ci.sd_id = sd.sd_id
      join regmdr.account_contact ac on ci.acct_cont_id = ac.acct_cont_id
      join regmdr.account acc on ac.acc_id = acc.acc_id
      where sd.sd_user_type in ('1','2')
      and sd.sd_origin_reference = 'www.alliancehealth.com'
      and to_char(ci.ci_create_date, 'MON') in ('JAN', 'FEB', 'MAR')
      group by to_char(ci.ci_create_date, 'yyyy-mm'
);