Sql Oracle中的日期比较,在给出错误的情况下

Sql Oracle中的日期比较,在给出错误的情况下,sql,oracle,date,Sql,Oracle,Date,[错误]ORA-00905(21577:32):PL/SQL:ORA-00905:在处缺少关键字 截止日期(上次更新日期)>=截止日期(第一年10月1日) 选择总和(转换值)总计、bectrn\u id、becat\u id 来自brvo_bemrc_交易 其中年份=p_年 和trn_类型=p_类型 和doc_type=p_doctype AND company=p_company 和bedfn_id=p_bedfn_id bectrn_id=v_bectrn_id 和becat_id=v_be

[错误]ORA-00905(21577:32):PL/SQL:ORA-00905:在处缺少关键字 截止日期(上次更新日期)>=截止日期(第一年10月1日)

选择总和(转换值)总计、bectrn\u id、becat\u id
来自brvo_bemrc_交易
其中年份=p_年
和trn_类型=p_类型
和doc_type=p_doctype
AND company=p_company
和bedfn_id=p_bedfn_id
bectrn_id=v_bectrn_id
和becat_id=v_becat_id
和案例
当(1,2,3)中的(从SYSDATE开始的月份)提取时
截止日期(上次更新日期)>=截止日期(第一年10月1日)和
截止日期(上次更新日期)=截止日期(第一年1月1日)和
截止日期(上次更新日期)=截止日期(第一年4月1日)和
截止日期(上次更新日期)=截止日期(第一年7月1日)和

截止日期(上次更新日期)您的
案例。。什么时候然后。。结束
不正确

让我们采取最后的行动,看看什么时候出了问题

WHEN ( -- condition for thus WHEN starts from here
      extract(month FROM SYSDATE) IN (10,11,12) 
     ) -- condition for thus WHEN ends here
THEN -- THEN must contain value which will be the result of case statement if when condition is true
-- but your query has expression here
-- you need to put any value here
   to_date(last_update_date) >= to_date(concat('01-JUL-',p_year-1))
   AND to_date(last_update_date) <= to_date(concat('30-SEP',p_year-1))
END
是的,正如@Wernfried Domscheit在评论中所建议的那样,您可以根据逻辑简化查询


干杯

我认为你的条件可以写得更简单,如下所示:

WHERE ...
   AND TRUNC(last_update_date, 'Q') = TRUNC(ADD_MONTHS(SYSDATE, -3), 'Q')
  • 您需要正确设置日期的格式

  • where子句中的
    case..when
    语句的结果
    不应该是布尔表达式,它们应该按

    截止日期(上次更新日期)>=情况为…

    截止日期(上次更新日期)
    分为两部分, 分别

  • 因此,请使用:

    SELECT SUM(trans_value) total, bectrn_id, becat_id
      FROM brvo_bemrc_transactions
     WHERE year = p_year
       AND trn_type = p_trntype
       AND doc_type = p_doctype
       AND company = p_company
       AND bedfn_id = p_bedfn_id
       AND bectrn_id = v_bectrn_id
       AND becat_id = v_becat_id
       AND to_date(last_update_date) >=
           CASE
             WHEN (extract(month FROM SYSDATE) IN (1, 2, 3)) THEN
               to_date(concat('01-OCT-', p_year - 1),'DD-MON-YYYY') 
             WHEN (extract(month FROM SYSDATE) IN (4, 5, 6)) THEN
               to_date(concat('01-JAN-', p_year - 1),'DD-MON-YYYY')
             WHEN (extract(month FROM SYSDATE) IN (7, 8, 9)) THEN
               to_date(concat('01-APR-', p_year - 1),'DD-MON-YYYY')
             WHEN (extract(month FROM SYSDATE) IN (10, 11, 12)) THEN
               to_date(concat('01-JUL-', p_year - 1),'DD-MON-YYYY')
           END
       AND to_date(last_update_date) <
           CASE
             WHEN (extract(month FROM SYSDATE) IN (1, 2, 3)) THEN
               to_date(concat('31-DEC-', p_year - 1),'DD-MON-YYYY') 
             WHEN (extract(month FROM SYSDATE) IN (4, 5, 6)) THEN
               to_date(concat('31-MAR-', p_year - 1),'DD-MON-YYYY')
             WHEN (extract(month FROM SYSDATE) IN (7, 8, 9)) THEN
               to_date(concat('30-JUN-', p_year - 1),'DD-MON-YYYY')
             WHEN (extract(month FROM SYSDATE) IN (10, 11, 12)) THEN
               to_date(concat('30-SEP', p_year - 1),'DD-MON-YYYY')
           END    
     GROUP BY bectrn_id, becat_id;
    
    选择总和(转换值)总计、bectrn\u id、becat\u id
    来自brvo_bemrc_交易
    其中年份=p_年
    和trn_类型=p_类型
    和doc_type=p_doctype
    AND company=p_company
    和bedfn_id=p_bedfn_id
    bectrn_id=v_bectrn_id
    和becat_id=v_becat_id
    截止日期(上次更新日期)>=
    案例
    当(1,2,3)中的(从SYSDATE开始的月份)提取时
    截至日期(concat('01-10-',p_year-1),'DD-MON-YYYY')
    当(从SYSDATE开始的月份)出现在(4,5,6)中时
    截至日期(concat('01-JAN-',p_year-1),'DD-MON-YYYY')
    当(从SYSDATE开始的月份)出现在(7,8,9)中时
    截止日期(年月日,第一年四月一日)
    当(从SYSDATE开始的月份)出现在(10,11,12)中时
    截止日期(第一年7月1日、第一年1月1日、第二年1月1日)
    结束
    和截止日期(上次更新日期)<
    案例
    当(1,2,3)中的(从SYSDATE开始的月份)提取时
    截至日期(concat('31-DEC-',p_year-1),'DD-MON-YYYY')
    当(从SYSDATE开始的月份)出现在(4,5,6)中时
    截至日期(concat('3月31日-',p_年份-1),'DD-MON-YYYY')
    当(从SYSDATE开始的月份)出现在(7,8,9)中时
    截至日期(第一年6月30日、第二个月1日、第二个月1日)
    当(从SYSDATE开始的月份)出现在(10,11,12)中时
    截止日期(第一年9月30日)和年月日
    结束
    按bectrn_id、becat_id分组;
    
    您的查询失败,因为您的
    大小写
    表达式产生一个布尔值,但Oracle的SQL没有布尔类型

    当我们想要创建布尔表达式时,我们使用一个
    大小写
    表达式。这通常用于
    SELECT
    子句中。
    WHERE
    子句已经是一个布尔表达式,它足以使用
    和括号来表达我们的目标。在您的情况下,您甚至可以使用模运算从当前季度到您感兴趣的季度

    SELECT SUM(trans_value) total, bectrn_id, becat_id
      FROM brvo_bemrc_transactions
     WHERE year = p_year
       AND trn_type = p_trntype
       AND doc_type = p_doctype
       AND company = p_company
       AND bedfn_id = p_bedfn_id
       AND bectrn_id = v_bectrn_id
       AND becat_id = v_becat_id
       AND extract(year from last_update_date) = p_year - 1
       AND mod(to_number(to_char(last_update_date, 'q')), 4) + 1 = to_number(to_char(sysdate, 'q'))
     GROUP BY bectrn_id, becat_id
     ORDER BY bectrn_id, becat_id;
    

    如果使用
    TRUNC(SYSDATE,'Q')
    和/或
    TRUNC(last\u update\u date,'Q')
    ,查询可能会更容易。也可能对您有所帮助。谢谢@Wernfried Domscheit..将我的查询
    修改为\u日期(concat('01-OCT-',p\u year-1))
    仅在某些设置下才有意义。您依靠DBMS猜测您使用的是英文月份缩写,前两位代表日期,后四位代表年份,日期部分可以用破折号分隔。不要让DBMS猜测。不要依赖可能匹配或不匹配的设置。告诉DBMS您使用的格式:
    to_date(concat('01-OCT-',p_year-1),'dd MON yyyy','NLS_date\u LANGUAGE=English')
    。至于您的
    CASE WHEN
    表达式:
    CASE WHEN
    必须产生一个值。不幸的是,由于Oracle SQL没有布尔类型,
    to_date(last_update_date)>=to_date(concat('01-OCT-',p_year-1))和to_date(last_update_date)),在
    to_date(last_update_date)
    中的日期(
    上一次更新_date
    )上使用
    to_date似乎很奇怪。这是怎么回事?
    last\u update\u date
    不是日期而是字符串吗?如果是这样:在数据库中以字符串形式存储日期是个坏主意。无论何时你想将字符串转换为日期,请指定转换所用的格式。谢谢@Tejash…实际上在我的Then语句中,我需要检查last_update_date range Inside,然后我需要为每种情况设置不同的范围是的,它也在这样做。在where语句中,您需要使用case。如果错误,请更正我。。在您的编辑中,我们在when条款中加入了日期和截止日期(上次更新日期)介于截止日期(第一年10月1日)和截止日期(第一年12月31日)之间。。然而,这应该是结果,而不是条件。我们可以那样投入吗。如果条件满足,它将产生结果为1,并且它再次与1进行比较,因此它将是相反的结果。
    SELECT SUM(trans_value) total, bectrn_id, becat_id
      FROM brvo_bemrc_transactions
     WHERE year = p_year
       AND trn_type = p_trntype
       AND doc_type = p_doctype
       AND company = p_company
       AND bedfn_id = p_bedfn_id
       AND bectrn_id = v_bectrn_id
       AND becat_id = v_becat_id
       AND to_date(last_update_date) >=
           CASE
             WHEN (extract(month FROM SYSDATE) IN (1, 2, 3)) THEN
               to_date(concat('01-OCT-', p_year - 1),'DD-MON-YYYY') 
             WHEN (extract(month FROM SYSDATE) IN (4, 5, 6)) THEN
               to_date(concat('01-JAN-', p_year - 1),'DD-MON-YYYY')
             WHEN (extract(month FROM SYSDATE) IN (7, 8, 9)) THEN
               to_date(concat('01-APR-', p_year - 1),'DD-MON-YYYY')
             WHEN (extract(month FROM SYSDATE) IN (10, 11, 12)) THEN
               to_date(concat('01-JUL-', p_year - 1),'DD-MON-YYYY')
           END
       AND to_date(last_update_date) <
           CASE
             WHEN (extract(month FROM SYSDATE) IN (1, 2, 3)) THEN
               to_date(concat('31-DEC-', p_year - 1),'DD-MON-YYYY') 
             WHEN (extract(month FROM SYSDATE) IN (4, 5, 6)) THEN
               to_date(concat('31-MAR-', p_year - 1),'DD-MON-YYYY')
             WHEN (extract(month FROM SYSDATE) IN (7, 8, 9)) THEN
               to_date(concat('30-JUN-', p_year - 1),'DD-MON-YYYY')
             WHEN (extract(month FROM SYSDATE) IN (10, 11, 12)) THEN
               to_date(concat('30-SEP', p_year - 1),'DD-MON-YYYY')
           END    
     GROUP BY bectrn_id, becat_id;
    
    SELECT SUM(trans_value) total, bectrn_id, becat_id
      FROM brvo_bemrc_transactions
     WHERE year = p_year
       AND trn_type = p_trntype
       AND doc_type = p_doctype
       AND company = p_company
       AND bedfn_id = p_bedfn_id
       AND bectrn_id = v_bectrn_id
       AND becat_id = v_becat_id
       AND extract(year from last_update_date) = p_year - 1
       AND mod(to_number(to_char(last_update_date, 'q')), 4) + 1 = to_number(to_char(sysdate, 'q'))
     GROUP BY bectrn_id, becat_id
     ORDER BY bectrn_id, becat_id;