本年度迄今为止,去年同期,以及其他

时间:2013-05-01 21:28:36

标签: sql sql-server-2008

我需要将一组日期归类为'Cur。 YTD','Lst。 YTD'或'其他'。 YTD基于getdate()。我有一个临时表供测试,它有一个名为'calendar_date'的DATETIME类型的列。我提出了这个逻辑,似乎有效。我只是想知道这种方法从性能角度来看是否合理,或者其他什么东西可能更好。

select calendar_date,
case when (MONTH(calendar_date) < MONTH(getdate()))
     or (MONTH(calendar_date) = MONTH (getdate())
         AND DAY(calendar_date) <= DAY(getdate())) then
case when YEAR(calendar_date) = YEAR(GETDATE()) then 'CYTD'
when YEAR(calendar_date) = YEAR(getdate()) - 1 then 'LYTD'
else 'Other'
end
else 'Other'
end as Tim_Tag_YTD
from #temp1

2 个答案:

答案 0 :(得分:2)

你的逻辑看起来很好,并且会按原样运作。

一种简化一点的替代方案,假设您没有未来数据。

select
  calendar_date,
  Tim_Tag_YTD = case DATEDIFF(YEAR, calendar_date, GETDATE())
                when 0 then 'CYTD'
                when 1 then 'LYTD'
                else 'Other'
                end
from #temp1;

对于您的逻辑,您明确将未来数据放入“其他”,您也可以这样做:

select
  calendar_date,
  Tim_Tag_YTD = case when calendar_date > GETDATE() then 'Other' else
                    case DATEDIFF(YEAR, calendar_date, GETDATE())
                    when 0 then 'CYTD'
                    when 1 then 'LYTD'
                    else 'Other'
                    end
                end
from #temp1;

答案 1 :(得分:0)

有时不直观的事情表现得更快。这样的事情可能值得一试。

set variable @FirstOfLastYear to Jan 1 of last year
using sql server date functions

set @FirstOfThisYear = DateAdd(year, 1, @FirstOfLastYear)

select 'last year' period
, whatever else you need
from #temp1 where calendar_date >= @FirstOfLastYear
and calendar_date < @FirstOfThisYear
union
select 'this year' period
, whatever else you need
from #temp1 where calendar_date >= @FirstOfThisYear
and calendar_date < getDate ()
union
select 'other' period
, whatever else you need
from #temp1 where calendar_date <= @FirstOfLastYear
or calendar_date > getdate()

除非你尝试,否则你永远不会知道。