簡體   English   中英

Oracle SQL-查詢開始和結束的月/年組合

[英]Oracle SQL - Query for begin and end month/year combination

我正在嘗試編寫一個查詢,該查詢將使用四段用戶輸入:

開始月份

始年

結束月份

年末

直到我遇到一個關於查詢編碼方式的小問題為止,這似乎很簡單,這種情況發生在以下輸入作為示例時:

開始月份:一月

開學年份:2012

結束月份:八月

年底年份:2013

用我編碼查詢的方式,它只接收了2012年1月至2012年8月以及2013年1月至2013年8月的數據。我希望它包含2012年全年的數據,然后包含2013年1月至2013年8月的數據。我猜我需要一個聯合聲明才能起作用,但是我承認我不太擅長Oracle SQL,因為我沒有太多機會經常練習它。 因此,我可能會以錯誤的方式進行操作。

我嘗試更新查詢以包含並集語句,並且Oracle拋出一個錯誤,原因是我在表達式中的三個字段(trsum.project_id,trsum.month和trsum.year)上使用了無效標識符。 當我嘗試將其更改為分配給各列的別名(ordered_id,ordered_month和ordered_year)時,收到關於project_id字段不是單個組函數的錯誤。 我顯然在創建包含按表達式分組的並集查詢方面缺少一些東西,但是如果我現在能弄清楚是什么,我會很驚訝。

我包括了更新后查詢的簡化版本,該版本保留了我在此處完整提及的所有要點,以供參考。 union語句之前的上半部分是我編寫的原始查詢,下半部分是我嘗試從上述示例中獲取所需數據的嘗試。 如果有人對我做錯的事情有任何建議或建議,或者有更好的方法來獲取我要查找的數據,那么我願意接受所有建議。 如果有什么需要我進一步澄清的,請隨時提出。

select * from(
    select  trsum.project_id as ordered_id
          , trsum.month as ordered_month
          , trsum.year as ordered_year
          , sum(trsum.costs) "Costs"
          , sum(trsum.hours) "Hours"
    from 
        substituteTableName trsum
    where
        trsum.month between :START_MONTH and :END_MONTH
        and trsum.year between :START_YEAR and :END_YEAR

    union

    select  trsum2.project_id as ordered_id
          , trsum2.month as ordered_month
          , trsum2.year as ordered_year
          , sum(trsum2.costs) "Costs"
          , sum(trsum2.hours) "Hours"
    from 
        substituteTableName trsum2
    where
        trsum2.month between :START_MONTH and 11
        and trsum2.year = :START_YEAR
)
group by trsum.project_id, trsum.month, trsum.year
order by
      ordered_id
    , ordered_year
    , ordered_month

您應該使用日期,而不僅僅是兩個月之間的日期,因為那是不正確的。 就像是:

WHERE 
  to_date((trsum.ppt_fiscal_month + 1 || '-' || trsum.ppt_fiscal_year), 'MM-YYYY') >=
      to_date((start_month || '-' || start_year), 'MM-YYYY'
AND 
to_date((trsum.month + 1 || '-' || trsum.year),'MM-YYYY') <= 
        to_date((end_month || '-' || end_year), 'MM-YYYY'

和其他條件類似。

我認為解決這些情況的一種簡便方法是將值轉換為YYYYMM形式。 您的where子句變為:

where trsum.year*100 + trsum.month between :START_YEAR * 100 + :START_MONTH and
                                           :END_YEAR * 100 + :END_MONTH


where trsum.year*100 + trsum.month between :START_YEAR * 100 + :START_MONTH
                                           :START_YEAR * 100 + 11;

當然,第二個不必更改。 它應該按書面規定正確工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM