2013-05-04 186 views
0

我試圖找到一種更有效的方式來重新編寫我的查詢。SQL Server查詢優化日期計算

有什麼建議嗎?我目前也在考慮將會計月份名稱顯示爲數字本身,然後比較並返回月份名稱。

(case         --proj_end_fis_mon 
    when (MYMW.mfg_year_no = FYQM.fiscal_year_no and MYMW.mfg_month_no = 12) 
    then      
     (convert(varchar,(MYMW.mfg_year_no-1))+'-'+(case 
      when FM.fiscal_month_name like 'Jan%' then '01' 
      when FM.fiscal_month_name like 'Feb%' then '02' 
      when FM.fiscal_month_name like 'Mar%' then '03' 
      when FM.fiscal_month_name like 'Apr%' then '04' 
      when FM.fiscal_month_name like 'May' then '05' 
      when FM.fiscal_month_name like 'June' then '06' 
      when FM.fiscal_month_name like 'July' then '07' 
      when FM.fiscal_month_name like 'Aug%' then '08' 
      when FM.fiscal_month_name like 'Sep%' then '09' 
      when FM.fiscal_month_name like 'Oct%' then '10' 
      when FM.fiscal_month_name like 'Nov%' then '11' 
      when FM.fiscal_month_name like 'Dec%' then '12' 
      end)) 
    else 
    (convert(varchar,MYMW.mfg_year_no)+'-'+(case 
    when FM.fiscal_month_name like 'Jan%' then '01' 
    when FM.fiscal_month_name like 'Feb%' then '02' 
    when FM.fiscal_month_name like 'Mar%' then '03' 
    when FM.fiscal_month_name like 'Apr%' then '04' 
    when FM.fiscal_month_name like 'May' then '05' 
    when FM.fiscal_month_name like 'June' then '06' 
    when FM.fiscal_month_name like 'July' then '07' 
    when FM.fiscal_month_name like 'Aug%' then '08' 
    when FM.fiscal_month_name like 'Sep%' then '09' 
    when FM.fiscal_month_name like 'Oct%' then '10' 
    when FM.fiscal_month_name like 'Nov%' then '11' 
    when FM.fiscal_month_name like 'Dec%' then '12' 
    end)) 


    end) 

這就是我的表是這樣的:

enter image description here

+3

爲什麼冗長'情況下FM.fiscal_month_name比如'Jan%',然後'01',當......結束時,而不僅僅是FM.fiscal_month_no? – 2013-05-04 15:16:27

+0

+1是的。那是更好的方法。只要將該數字轉換爲varchar即可。謝謝。 :) – camelbrush 2013-05-04 20:01:42

回答

2

假設你有會計月份可供選擇:

Convert(VarChar(4), MYMW.mfg_year_no - 
    case when MYMW.mfg_year_no = FYQM.fiscal_year_no and MYMW.mfg_month_no = 12 then 1 
     else 0 end) + 
    '-' + Right('0' + Convert(VarChar(2), FM.fiscal_month_no), 2) 
+0

+1這對我很好。 謝謝。 你能否用簡單的'英文'來解釋它背後的邏輯? :) – camelbrush 2013-05-04 20:02:30

+1

@camelbrush - 第一部分'將製造年份從一個整數轉換爲一個字符串。藏在裏面的是'情況',如果你指定的條件匹配,從一年中減去一個,否則它減去零。這需要處理示例代碼的第一部分和第二部分之間的唯一區別(請原諒雙關語)。最後一行連接短劃線,然後處理月份。月份編號是從整數轉換爲字符串。由於它可能是一位或兩位數字,因此在左側添加一個零,然後採用「正確」兩個字符。 – HABO 2013-05-04 21:04:01