[英]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.