0

我正在为 Oracle SQL Dev 中的 Crystal 报表编写命令,但遇到了问题。我的用户希望有允许他们使用格式为“yyyymm”的起始年份/期间和结束参数相同的参数。我发生的问题是,使用这些参数他们还想从 2012 财年到 2013 财年和第 10 期(从 2012 财年)到第 06 期(从 2013 财年)如何设置我的命令来处理这个? 以下是我目前正在处理表、视图、API 等的一些代码,出于安全目的,它们的名称已更改

SELECT SOO.PART_NO,
   AP.ACCOUNTING_YEAR,
   AP.ACCOUNTING_PERIOD,
   INVENTORY_PART_API.GET_DESCRIPTION(SOO.CONTRACT, SOO.PART_NO)         AS PART_DESCRIPTION,
   SUM(SO.QTY_COMPLETE)                                                           AS QTY_COMP,
   MAX(PART_COST_API.GET_TOTAL_ACCUM_COST(SOO.CONTRACT,SOO.PART_NO,'1','*','*'))  AS TOTAL_ACCUM_COST,       
   MAX(ORA_DATABASE_NAME)                                                         AS ORA_DATABASE_NAME
FROM SHOP_ORDER_OPERATION_TAB SOO
LEFT JOIN ACCOUNTING_PERIOD_TAB AP
   ON SOO.CONTRACT = '09'
   AND SOO.OPER_STATUS_CODE = '90'
   AND SOO.CONTRACT = AP.COMPANY
   AND SOO.LAST_ACTIVITY_DATE BETWEEN AP.DATE_FROM AND AP.DATE_UNTIL 
LEFT JOIN SHOP_ORD SO
   ON SOO.CONTRACT = '09'
   AND SOO.OPER_STATUS_CODE = '90'
   AND SO.ORDER_NO = SOO.ORDER_NO
   AND SO.RELEASE_NO = SOO.RELEASE_NO
   AND SO.SEQUENCE_NO = SOO.SEQUENCE_NO
   AND SO.CONTRACT = SOO.CONTRACT
WHERE SOO.CONTRACT = '09'
   AND SOO.OPER_STATUS_CODE = '90'
   AND NVL(AP.ACCOUNTING_PERIOD,0) BETWEEN SUBSTR('201205',5,2) AND SUBSTR('201306',5,2) 
   AND NVL(AP.ACCOUNTING_YEAR,0) BETWEEN 2012 AND 2013                
GROUP BY SOO.CONTRACT, 
   SOO.PART_NO ,
   AP.ACCOUNTING_YEAR,
   AP.ACCOUNTING_PERIOD
ORDER BY 
   AP.ACCOUNTING_PERIOD ASC,
   AP.ACCOUNTING_YEAR ASC,
  SOO.PART_NO ASC;
4

2 回答 2

0

我做了一些与你的问题非常相似的事情。让生活变得如此轻松的是将财政年度和期间结合在一起。

你在哪里

AND NVL(AP.ACCOUNTING_PERIOD,0) BETWEEN SUBSTR('201205',5,2) AND SUBSTR('201306',5,2) 
AND NVL(AP.ACCOUNTING_YEAR,0) BETWEEN 2012 AND 2013    

尝试这个

AND NVL(AP.ACCOUNTING_YEAR,0) || NVL(AP.ACCOUNTING_PERIOD,0) BETWEEN '201205' AND '201306' 

我的会计年度和期间是 VARCHAR,因此您拥有的输入参数可以使用。如果您的 FP 是一个数字,您可能必须在参数中考虑该 0。

于 2013-06-16T17:36:35.463 回答
0

与其按 YEAR 和 MONTH 划分,为什么不采用提供的 YYYYMM 并将它们转换为适当的日期,以便您可以使用 BETWEEN,例如:

BETWEEN TO_DATE(yyyymm || '01', 'YYYYMMDD') AND LAST_DAY(TO_DATE(yyyymm || '01', 'YYYYMMDD'))

last_day 为您喂它的任何日期返回该月的最后一天,因此 9 月、4 月、6 月和 11 月没有 30 天的大惊小怪......

如果您的问题的症结在于 WHERE 标准:

WHERE SOO.CONTRACT = '09'
   AND SOO.OPER_STATUS_CODE = '90'
   AND NVL(AP.ACCOUNTING_PERIOD,0) BETWEEN SUBSTR('201205',5,2) AND SUBSTR('201306',5,2) 
   AND NVL(AP.ACCOUNTING_YEAR,0) BETWEEN 2012 AND 2013   

考虑将上面的最后两行组合成:

AND TO_DATE(NVL(AP.ACCOUNTING_PERIOD,0) || NVL(AP.ACCOUNTING_YEAR,0) || '01', 'YYYYMMDD') 
    BETWEEN TO_DATE(yyyymm || '01', 'YYYYMMDD') AND TO_DATE(yyyymm || '01', 'YYYYMMDD')

必须仔细检查语法,但想法是您将 YYYYMM 转换为正确的日期,以便您可以使用 BETWEEN。

由于您没有比较实际日期,并且 BETWEEN 包含在内,因此您根本不需要 LAST_DAY 函数。

于 2013-06-14T20:50:57.137 回答