【问题标题】:Input year in the specified range在指定范围内输入年份
【发布时间】:2017-07-19 08:38:07
【问题描述】:

我有一个查询和苹果 CASE 函数并出现错误

(完整)年份必须介于 -4713 和 +9999 之间,并且不能为 0

此代码产生错误:

NVL(     
CASE WHEN Ea.ASGACTSTART < add_months(SYSDATE,-12)  THEN 365
ELSE 
to_number( to_char(to_date('1','J') +
((SYSDATE -1) - Ea.ASGACTSTART), 'J') )
END , 0)  "Adujsted Days", 

【问题讨论】:

  • to_number( to_char(to_date('1','J')的目的是什么?

标签: oracle plsql


【解决方案1】:

我认为你可以简单地制作

CASE WHEN Ea.ASGACTSTART < add_months(SYSDATE,-12)  THEN 365
ELSE NVL(SYSDATE - 1 - Ea.ASGACTSTART, 0)
END AS "Adujsted Days"

【讨论】:

  • 什么是“单值”?如果需要,用TRUNC()ROUND() 包围它。
  • 谢谢,我在 Excel 中有公式,但我不需要 Excel 中的任何公式有什么我可以在 Oracel 中将 excel 公式转换为的东西吗?这里是 Excel 公式 =+IF(ISBLANK(@Enddate),IF ($StartDate
【解决方案2】:

给定:

create table tabby (ASGACTSTART date);
insert into tabby values (sysdate);

问题是你表达的这一部分:

select 
   to_date('1','J') + ((SYSDATE -1) - Ea.ASGACTSTART)
from tabby ea;

如果您将+ 更改为,,那么您就会明白为什么会出现问题。

select 
   --to_date('1','J') + ((SYSDATE -1) - Ea.ASGACTSTART)
     to_date('1','J') , ((SYSDATE -1) - Ea.ASGACTSTART)
from tabby ea;

至少根据one other post,to_date('1','J') 旨在返回可能的最小日期。但是,+ 的右侧可能是负数,因此会导致 RDBMS 抱怨。

我创建的用例就是为了做到这一点。

【讨论】:

  • 不一致的数据类型:预期 DATE 得到 DATE JULIAN
猜你喜欢
  • 2012-12-14
  • 2016-08-17
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 2020-12-07
  • 2014-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多