繁体   English   中英

如何根据日期以一个月为增量填充表格

[英]How can I populate a table in one month increments based on a date

我需要根据一个月的第一天到该月的最后一天之间的另一个表的输入日期来加载表。 我需要将负载从当前月份的1个月减少为1个月的记录,然后从当前月份开始2个月,依此类推。

我已经尝试过使用光标进行CTE,并手动更改datediff参数。 最后一种方法有效,但是我想动态加载表

Declare @StartDt as datetime = (SELECT FORMAT(DATEADD(s,0,DATEADD(mm, DATEDIFF(m,0,GETDATE())-1,0)),'MM/dd/yyyy'));

Declare @endDt as datetime = EOMONTH(@StartDt);

SELECT  useruid, 
    userfullname,
    sum(totaltime)SumTime,
    @StartDt as StartDate, 
    @EndDt as EndDate

FROM Table_1.tbl
WHERE ENTRYDATE between @StartDt  and @EndDt
group by useruid, USERFULLNAME;

我将其插入另一个表。 通过手动将Startdt变量中的-1更改为-2等,我这样做没有问题。 我想知道是否可以在加载另一个表时动态更改它。

同样,我没有问题加载表。 我只想知道是否有更有效的方法,因为我必须回溯100个月。

一种方法是递归CTE:

with dates as (
      select datefromparts(year(getdate()), month(getdate()), 1) as dte
      union all
      select dateadd(month, -1, dte)
      from dates
      where dte > ?  -- how far back do you want to go?
     )
select t.useruid, t.userfullname, sum(t.totaltime) as SumTime,
       d.dte as StartDate, 
       dateadd(month, 1, d.dte) as EndDate
from dates d JOIN
     Table_1.tbl t
     on t.ENTRYDATE >= d.dte AND
        t.ENTRYDATE < dateadd(month, 1, d.dte) 
group by t.useruid, t.USERFULLNAME, d.dte;

您不需要(显式)循环或游标。

注意:由于某种原因,您似乎要从日期中减去一秒钟。 我不明白为什么。 您可能需要这种逻辑作为结束日期,但是最好使用on子句中的不等式(例如,您不必担心毫秒)。

您可以使用动态SQL即时编写@StartDt声明语句。

我将您的代码放入while循环中,该循环将运行100次。 (返回100个月):

declare @int int = 0
while @int > -100
begin
set @int= @int -1
declare @str varchar(max)
set @str = 'declare @StartDt as datetime = (SELECT FORMAT(DATEADD(s,0,DATEADD(mm, DATEDIFF(m,0,GETDATE())'+cast(@int as varchar(10))+',0)),''MM/dd/yyyy''))'
execute (@str)

Declare @endDt as datetime = EOMONTH(@StartDt)

SELECT  useruid, 
    userfullname,
    sum(totaltime)SumTime,
    @StartDt as StartDate, 
    @EndDt as EndDate

FROM Table_1.tbl
WHERE ENTRYDATE between @StartDt  and @EndDt
group by useruid, USERFULLNAME
end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM