SQL Server从Period获取运营天数

时间:2014-05-24 09:49:35

标签: sql-server period

我有桌子季节:

YEAR    DATE_FROM    DATE_TO

2013    2013-04-21   2013-11-14

2014    2014-04-03   2014-12-03

我需要一个查询作为@ year,@ month,@ type的参数,并返回

@type =

1)@year的@month期间所包含的日期

2)从期间开始到@year @month结束的日期

示例:

@ type = 1,@ month = 5,@ year = 2013应返回 31天

@ type = 2,@ month = 5,@ year = 2013应返回 40天

提前Thanx!

1 个答案:

答案 0 :(得分:1)

你需要做两件事。第一个是找到匹配的行。第二是按你的要求总结。我认为最好的总结方法是将@year@month转换为月初。然后添加一个月并减去一个月末的一天。我认为以下内容捕获了逻辑:

  select (case when @type = 1
               then datediff(day, thedate,
                             (case when datediff(day, date_from, dateadd(month, 1, thedate)) > date_to
                                   then dateadd(day, -1, datediff(day, date_from, dateadd(month, 1, thedate)) )
                                   else date_to
                              end) 
                             )
               when @type = 2
               then datediff(day, date_from, dateadd(month, 1, thedate)) - 1
          end)
  from seasons s cross join
       (select cast(cast(@year*100000  + @month*100 + 1 as varchar(255)) as date) as thedate
  where @year * 100 + @month between year(s.date_from) * 100 + month(s.date_from) and
                                     year(s.date_to) * 100 + month(s.date_to)