如何将“获取日期+1的数据”转换为sql查询(可选oracle过程解决方案)

如何将“获取日期+1的数据”转换为sql查询(可选oracle过程解决方案),sql,oracle,increment,Sql,Oracle,Increment,你好,我似乎找不到解决这个问题的办法 我有这个疑问 注意:日期和所有列都使用VARCHAR作为数据类型 及 整个查询的目的是比较CountedStock和SystemStock的数量。要获得CountedStock,我必须使用查询在N日期计算股票。在获得CountedStock之后,我想将其与SystemStock进行比较,SystemStock是N+1日期的股票 如果CountedStock和SystemStock不匹配,那么这是一个问题,这就是我想要找到的,但这与这里的问题无关 问题是,我想

你好,我似乎找不到解决这个问题的办法

我有这个疑问

注意:日期和所有列都使用VARCHAR作为数据类型

整个查询的目的是比较CountedStock和SystemStock的数量。要获得CountedStock,我必须使用查询在N日期计算股票。在获得CountedStock之后,我想将其与SystemStock进行比较,SystemStock是N+1日期的股票

如果CountedStock和SystemStock不匹配,那么这是一个问题,这就是我想要找到的,但这与这里的问题无关

问题是,我想得到每个日期的结果。当前查询只给出1个日期的结果,我必须自己指定它20151001

让我陷入困境的是SystemStock日期,因为如果我想得到每个日期的结果,那么我必须写下

where stockurp.date = stockurp.date+1 
这在sql中显然没有意义,我似乎无法将该算法转换为sql查询

甚至可以在sql查询中这样做吗?我非常感谢你的帮助。哦,还有,有人建议我应该使用程序,我正在使用Toad for Oracle,但我不知道如何使用


因此,如果你有一个想法,使一个甲骨文程序为这一点,请告诉我。提前感谢各位。

因为您将日期存储为字符串,这是您永远不应该做的,但同样的情况也适用,您需要将字符串从一种格式转换为另一种格式以进行比较,在第二种情况下还需要添加一天。这意味着将字符串反弹到实际日期并返回到字符串;在第一个嵌套联接中,该联接看起来像:

reportenableurp.date = to_char(to_date(stockurp.date, 'YYYYMMDD'), 'YYYY-MM-DD')
“date”当然不是一个有效的列名,但我将比较的左侧保留为字符串,并将右侧转换了两次,以防“date”列被索引,如果将其存储为实际日期,效果也会更好。您还可以将两面都转换为日期以进行比较

从每个内部视图中提取日期可以将它们作为联接条件进行比较;只要稍作改动:

SELECT CountedDate, SystemDate, CODE, CREDIT, Q1, Q2, Q3, CountedStock, SystemStock
FROM
    (
    select table1.dat as CountedDate, table1.CODE as CODE, table1.credit as CREDIT, Q1, Q2, Q3, Q1 + Q2 - Q3 CountedStock
    from
       (select stockurp.dat, stockurp.code as CODE, stockurp.credit, stockurp.quantity as Q1, reportenableurp.qty as Q2
       from stockurp join reportenableurp 
       on stockurp.code = reportenableurp.code and stockurp.credit = reportenableurp.credit 
       and reportenableurp.dat = to_char(to_date(stockurp.dat, 'YYYYMMDD'), 'YYYY-MM-DD')
       )   
       table1
       join
       (select accountid, credit, count (recharge.credit) as Q3
       from recharge
       group by accountid, credit) table2
       ON table1.CODE=table2.accountid
       AND table1.credit=table2.credit
    ) tableA
JOIN
    (
    select stockurp.dat as SystemDate, stockurp.code as KODE, stockurp.credit as KREDIT, stockurp.quantity as SystemStock
    from stockurp ) tableB
on CODE=KODE and CREDIT=KREDIT
and SystemDate = to_char(to_date(CountedDate, 'YYYYMMDD') + 1, 'YYYYMMDD')
where CountedStock <> SystemStock;
除非我遗漏了什么,否则我可能会用更简单的连接替换内联视图:

SELECT stock_1.dat as CountedDate, stock_2.dat as SystemDate, stock_1.code,
  stock_1.credit, stock_1.quantity as Q1, report.qty as Q2, count(recharge.credit) as Q3,
  stock_1.quantity + report.qty - count(recharge.credit) as CountedStock,
  stock_2.quantity as SystemStock
FROM stockurp stock_1
JOIN reportenableurp report
ON report.code = stock_1.code
AND report.credit = stock_1.credit
AND report.dat = to_char(to_date(stock_1.dat, 'YYYYMMDD'), 'YYYY-MM-DD')
JOIN recharge
ON recharge.accountid = stock_1.code
AND recharge.credit = stock_1.credit
JOIN stockurp stock_2
ON stock_2.code = stock_1.code
AND stock_2.credit = stock_1.credit
AND stock_2.dat = to_char(to_date(stock_1.dat, 'YYYYMMDD') + 1, 'YYYYMMDD')
GROUP BY stock_1.dat, stock_2.dat, stock_1.code, stock_1.credit, stock_1.quantity,
  report.qty, stock_2.quantity
HAVING stock_1.quantity + report.qty - count(recharge.credit) <> stock_2.quantity;


当然,这假设您的所有“日期”字符串实际上都可以成功转换为实际日期,并且您没有任何损坏的数据。

日期列使用VARCHAR作为数据类型-为什么?永远不要在VARCHAR列中存储日期。像date_column+1这样的东西对于日期来说是有意义的,但是对于varchar来说就没有意义了。您希望每个日期都在一个范围内吗?每个日期都有数据吗?还有别的吗?您有多确定所有字符串值实际上都表示真实日期,并且它们在每列中的格式是否相同?我不知道为什么你会有两种不同的格式在不同的表中,就像你看起来一样,但这是一个小小的麻烦,首先把它们存储为字符串。非常感谢你的响应,令人惊讶的解决方案。但当我尝试运行它时,它似乎给出了这个错误:ORA-01830:date格式图片在转换整个输入字符串之前结束。日期有问题吗?它指向这一行:stock_2.dat=to_charto_datestock_1.dat,'yyyyymmdd'+1,'yyyyymmdd'看起来您的数据与yyyyyymmdd格式不匹配,可能是因为该列允许超过8个字符,而且有人在其中输入了更长的值。您需要检查表中的原始数据以查看其中的内容,例如,首先查找lengthdat>8作为原始检查。
reportenableurp.date = to_char(to_date(stockurp.date, 'YYYYMMDD'), 'YYYY-MM-DD')
SELECT CountedDate, SystemDate, CODE, CREDIT, Q1, Q2, Q3, CountedStock, SystemStock
FROM
    (
    select table1.dat as CountedDate, table1.CODE as CODE, table1.credit as CREDIT, Q1, Q2, Q3, Q1 + Q2 - Q3 CountedStock
    from
       (select stockurp.dat, stockurp.code as CODE, stockurp.credit, stockurp.quantity as Q1, reportenableurp.qty as Q2
       from stockurp join reportenableurp 
       on stockurp.code = reportenableurp.code and stockurp.credit = reportenableurp.credit 
       and reportenableurp.dat = to_char(to_date(stockurp.dat, 'YYYYMMDD'), 'YYYY-MM-DD')
       )   
       table1
       join
       (select accountid, credit, count (recharge.credit) as Q3
       from recharge
       group by accountid, credit) table2
       ON table1.CODE=table2.accountid
       AND table1.credit=table2.credit
    ) tableA
JOIN
    (
    select stockurp.dat as SystemDate, stockurp.code as KODE, stockurp.credit as KREDIT, stockurp.quantity as SystemStock
    from stockurp ) tableB
on CODE=KODE and CREDIT=KREDIT
and SystemDate = to_char(to_date(CountedDate, 'YYYYMMDD') + 1, 'YYYYMMDD')
where CountedStock <> SystemStock;
SELECT stock_1.dat as CountedDate, stock_2.dat as SystemDate, stock_1.code,
  stock_1.credit, stock_1.quantity as Q1, report.qty as Q2, count(recharge.credit) as Q3,
  stock_1.quantity + report.qty - count(recharge.credit) as CountedStock,
  stock_2.quantity as SystemStock
FROM stockurp stock_1
JOIN reportenableurp report
ON report.code = stock_1.code
AND report.credit = stock_1.credit
AND report.dat = to_char(to_date(stock_1.dat, 'YYYYMMDD'), 'YYYY-MM-DD')
JOIN recharge
ON recharge.accountid = stock_1.code
AND recharge.credit = stock_1.credit
JOIN stockurp stock_2
ON stock_2.code = stock_1.code
AND stock_2.credit = stock_1.credit
AND stock_2.dat = to_char(to_date(stock_1.dat, 'YYYYMMDD') + 1, 'YYYYMMDD')
GROUP BY stock_1.dat, stock_2.dat, stock_1.code, stock_1.credit, stock_1.quantity,
  report.qty, stock_2.quantity
HAVING stock_1.quantity + report.qty - count(recharge.credit) <> stock_2.quantity;