如何将日期时间拆分为数周/月,具体取决于用户在SQL中放置的内容

时间:2013-11-26 10:33:39

标签: sql sql-server date datetime split

我正在创建一个报告,该报告将根据用户输入的开始日期和结束日期使用条形图进行拆分。

如果用户将开始日期和结束日期设置为少于8周,则日期将分为几周,但如果是8周或更长,则将其拆分为几个月。

e.g。如果用户输入日期为01/11/2013 - 2013年11月30日,那么它将分为01/11/2013 - 03/11/2013,04/11/2013 - 10/11 / 2013,11 / 11/2013 - 17/11 / 2013,18 / 11/2013 - 24/11 / 2013,25 / 11/2013 - 2013年11月30日

但如果投入日期如01/05/2013 - 2013年11月30日将分为01/05/2013 - 31/05 / 2013,19 / 06/2013 - 30/06/2013等等上。

我有@StartDate和@EndDate作为我的参数,我环顾四周并尝试了许多不同的东西但是无法让它工作任何帮助都会很棒!

由于

Thomas James

2 个答案:

答案 0 :(得分:2)

你去..

declare @startDate datetime='09/01/2013'
declare @endDate datetime='11/30/2013'
DECLARE @WEEKCOUNT INT
declare @magic int

SELECT @WEEKCOUNT = DATEDIFF(WEEK,@startDate,@endDate)
SELECT @magic = case when @WEEKCOUNT<8 then @WEEKCOUNT else (month(@endDate)-month(@startDate))+1 end


;WITH CTESplit
as
(
    select 1 as weekcount,
    CASE WHEN @WEEKCOUNT < 8 THEN DATEADD(dd, -(DATEPART(dw, @startDate))+1, @startDate) 
    ELSE DATEADD(dd, -(DAY(@startDate)-1), @startDate) END  [WeekStart], 
    CASE WHEN @WEEKCOUNT < 8 THEN DATEADD(dd, 7-(DATEPART(dw, @startDate))+1, @startDate) 
    else DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@startDate)+1,0)) end [WeekEnd]


    union all

    select a.weekcount+1 as weekcount,
    CASE WHEN @WEEKCOUNT < 8 THEN DATEADD(dd, -(DATEPART(dw, @startDate+(7*(a.weekcount+1))))+2, @startDate+(7*(a.weekcount+1))) 
    ELSE DATEADD(dd, -(DAY(@startDate+(30*(a.weekcount+1)))-1), @startDate+(30*(a.weekcount+1))) END  [WeekStart], 
    CASE WHEN @WEEKCOUNT < 8 THEN DATEADD(dd, 7-(DATEPART(dw, @startDate+(7*(a.weekcount+1))))+1, @startDate+(7*(a.weekcount+1))) 
    else DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@startDate+(30*(a.weekcount+1)))+1,0)) end [WeekEnd]
    from CTESplit a where (a.weekcount+1)<=@magic



)

select * from CTESplit

答案 1 :(得分:1)

我猜你在使用SQL Server?

为什么不使用现有的week参数,让您的生活更轻松?

group by datepart(week, YourDate)

这将为您提供一年中的周数。将您的日期转移到下一周或上周的开始,或者在您的组的任何一端都有部分。