![](/img/trans.png)
[英]How to split the specify date range into monthly wise in sql server and loop through each month to perform some operation
[英]How to Perform While loop with Date in SQL Server?
我想通過循環按日期插入記錄。 這就是我嘗試過的。
DECLARE @str VARCHAR(500) = '1400,2001,2400,1201,1001,1302'
DECLARE @startDate datetime = '2015-01-01 00:00:00'
DECLARE @endDate datetime = '2015-01-01 23:59:59'
WHILE (@startDate<='2015-01-31 00:00:00')
BEGIN
WHILE LEN(@str) > 0
BEGIN
DECLARE @storeid VARCHAR(100)
IF CHARINDEX(',',@str) > 0
SET @storeid = SUBSTRING(@str,0,CHARINDEX(',',@str))
ELSE
BEGIN
SET @storeid = @str
SET @str = ''
END
Print @storeid
Print @startDate
SET @str = REPLACE(@str,@storeid + ',' , '')
END
SET @startDate = @startDate+1;
END
輸出值
1400
Jan 1 2015 12:00AM
2001
Jan 1 2015 12:00AM
2400
Jan 1 2015 12:00AM
1201
Jan 1 2015 12:00AM
1001
Jan 1 2015 12:00AM
1302
Jan 1 2015 12:00AM
但這不起作用。 只需插入一次即可。 它不會繼續。 謝謝
編輯:在寬限期內,該問題已發生重大變化。 這是對原始問題的解答。
您根本不需要循環(實際上,您幾乎絕對不需要SQL中的循環)。
您可以通過使用統計表生成日期列表,然后在INSERT
上對其進行JOIN
來實現此目的:
Declare @FromDate Date = '2015-01-01',
@ToDate Date = '2015-01-31'
;With E1(N) As (Select 1 From (Values (1), (1), (1), (1), (1), (1), (1), (1), (1), (1)) DT(N)),
E2(N) As (Select 1 From E1 A Cross Join E1 B),
E4(N) As (Select 1 From E2 A Cross Join E2 B),
E6(N) As (Select 1 From E4 A Cross Join E2 B),
Tally(N) As
(
Select Row_Number() Over (Order By (Select Null))
From E6
),
Dates As
(
Select DateAdd(Day, N - 1, @FromDate) Date
From Tally
Where N <= DateDiff(Day, @FromDate, @ToDate) + 1
)
INSERT INTO Transaction_Info
SELECT
TransactionNumber,StoreID,Time
FROM
[HQMatajer].[dbo].[Transaction] T
JOIN
Dates D ON D.Date = Convert(Date, T.Time)
WHERE
StoreID=1302;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.