2013-05-04 170 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