【问题标题】:sum of column with dates selected from other table against dates give me wrong answer when compare dates比较日期时,从其他表中选择日期的列与日期的总和给了我错误的答案
【发布时间】:2021-06-27 18:54:55
【问题描述】:

我写了一个代码,它给了我错误的答案它做了什么它比较两个表中的日期并从中检查星期天并返回给我item 列的总和它检查星期天它的工作正常但是当它检查其他表日期并比较时有自己的日期,然后给出总和是错误的,请帮助解决这个问题 您也可以在此处查看dbfiddle

DECLARE
a number;
B DATE;
CURSOR GZDT IS
SELECT GAZZETED_DATE  FROM GAZZETED_DAYS
WHERE GAZZETED_DATE between date '2021-01-01' and date '2021-01-20';

begin
    OPEN GZDT;
    LOOP 
        FETCH GZDT INTO B;      
         EXIT WHEN GZDT%notfound;
    END LOOP;
    CLOSE GZDT;
SELECT  SUM(ITEM) into a from pay_in_out
  where TO_CHAR(att_date,'DY', 'NLS_DATE_LANGUAGE=AMERICAN') NOT IN ('SUN')
   AND ATT_DATE != B
  AND att_date between date '2021-01-01' and date '2021-01-20'  
  AND EMP_CODE = 100;
  dbms_output.put_line('the sum of item is :'||a) ;
  
end;
/

【问题讨论】:

  • 当我单独运行查询时,您的代码运行良好。请分享您的预期输出是什么? dbfiddle.uk/…
  • "sum is wrong" 但是,您没有告诉我们正确的值是多少。请edit您的问题,并包含一个minimal reproducible example,其中包含用于构建您的示例的所有代码(这样如果 dbfiddle 死了,您的问题仍然有意义)以及您的预期答案的详细信息以及背后的逻辑为什么应该得到答案。

标签: oracle plsql oracle11g


【解决方案1】:

从您的 dbfiddle 中的示例数据来看,您似乎想要计算未出现在 GAZZETED_DAYS 表中的所有日期的值。

不幸的是,您的 B 变量仅包含一个 date 值,而您的表有 5 个示例值。结果,您的游标 LOOP 覆盖了 B 5 次,最后只有 26-JAN-21

如果您想检查表中的所有值,NOT IN 子句可能比游标和变量更容易解决。

DECLARE
  a number;

begin

SELECT  SUM(ITEM) into a from pay_in_out
  where 
   ATT_DATE NOT IN 
     (SELECT GAZZETED_DATE FROM GAZZETED_DAYS
      WHERE GAZZETED_DATE between date '2021-01-01' and date '2021-01-20')
  AND att_date between date '2021-01-01' and date '2021-01-20'  
  AND EMP_CODE = 100;
  dbms_output.put_line('the sum of item is :'||a) ;
  
end;
/

【讨论】:

  • 感谢他的工作,我需要向你致以最诚挚的问候
猜你喜欢
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
  • 2013-07-27
  • 2019-03-03
  • 1970-01-01
  • 1970-01-01
  • 2021-01-23
  • 1970-01-01
相关资源
最近更新 更多