我有桌子季节:
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!
答案 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)