簡體   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