如何解决SQL 查询,将数据限制在 2 个日期之间
在 SQL 中,我将编写一个查询,该查询在 2 个日期之间插入所有数据,并且我还想导入 1000 个批次,但由于这些天之间的数据数量超过了我打算编写的限制一个循环,它使较小的周期带来数据。 这是我的代码:
DECLARE @StartDate DATETIME = CAST('2021-06-02 01:00:00.000' AS DATETIME)
DECLARE @EndDate DATETIME = CAST('2021-06-23 01:00:00.000' AS DATETIME)
DECLARE @RealRowCount INT = (SELECT DISTINCT SUM(@@ROWCOUNT) OVER() FROM GetReport (
@StartDate,@EndDate))
DECLARE @TransactionCount INT = (SELECT DISTINCT TransactionCount FROM GetReport (
@StartDate,@EndDate))
WHILE @RealRowCount < @TransactionCount
BEGIN
DECLARE @DiffDate INT = (SELECT DATEDIFF(DAY,@StartDate,@EndDate))
SET @EndDate = DATEADD(DAY,@DiffDate/2,@StartDate)
SELECT *,@EndDate FROM GetReport (@StartDate,@EndDate)
END
PS: 本来想找日期的中间,然后改成新的 EneDate 和 StartDate 但是这里有问题!
解决方法
你的问题不是很清楚。假设您在两个日期之间有 10,000 条记录,并且您不想一次检索超过一千条记录。在这种情况下,您可以使用分页。在程序代码和 SQL 中。
DECLARE @StartDate DATETIME = CAST('2021-06-02 01:00:00.000' AS DATETIME)
DECLARE @EndDate DATETIME = CAST('2021-06-23 01:00:00.000' AS DATETIME)
DECLARE @RealRowCount INT = (SELECT DISTINCT COUNT(*) FROM Products WHERE InsertDate BETWEEN @StartDate AND @EndDate)
DECLARE @Counter INT = 0
WHILE @Counter <= @RealRowCount
BEGIN
SELECT *
FROM Products
WHERE InsertDate BETWEEN @StartDate AND @EndDate
ORDER BY InsertDate
OFFSET @Counter ROWS -- skip @Counter rows
FETCH NEXT 1000 ROWS ONLY -- take 1000 rows
SET @Counter = @Counter + 1000
END
或者您可以获取两个日期之间的时差并在特定步骤中每次添加开始日期并检索该日期的数据。
例如,日期差为 20 天。每次将开始日期增加 5 步到开始日期和结束日期
,我创建了另一个表来放置日期,如果该表有任何行,我可以获得“EndDate”,但如果它没有任何记录,我只需使用我指定的日期。 AccSync 是我插入记录详细信息的表,AccTransformation 是我想要插入所有记录的表。
DECLARE @Count INT = (SELECT COUNT(*) FROM [AccTransaction])
DECLARE @Flag BIT = (SELECT IIF(@Count > 1,1,0))
DECLARE @End DATETIME = GETDATE();
DECLARE @Start DATETIME
IF(@Flag = 0)
BEGIN
SET @Start = CAST('2021-03-08' AS DATETIME2);
SET @Flag = 1
END
ELSE IF(@Flag = 1)
BEGIN
SET @Start = (SELECT TOP 1 EndDate FROM (SELECT EndDate FROM [AccSync] ORDER BY ActionDate DESC OFFSET 0 ROW) AS TT);
END
DECLARE @RealRowCount INT = (SELECT DISTINCT SUM(@@ROWCOUNT) FROM [GetReport] (@Start,@End));
DECLARE @TransactionCount INT = (SELECT DISTINCT TransactionCount FROM [GetReport] (@Start,@End));
----------------------------------------------------------------------------------------------
WHILE (@RealRowCount <> @TransactionCount)
BEGIN
DECLARE @DiffDate INT = (SELECT DATEDIFF(SECOND,@Start,@End))
SET @End = DATEADD(SECOND,(@DiffDate/2),@Start)
SET @RealRowCount = (SELECT DISTINCT SUM(@@ROWCOUNT) FROM [GetReport] (@Start,@End))
SET @TransactionCount = (SELECT DISTINCT TransactionCount FROM [GetReport] (@Start,@End))
END
----------------------------------------------------------------------------------------------
INSERT INTO [AccTransaction]
SELECT *
FROM [GetReport](@Start,@End)
----------------------------------------------------------------------------------------------
INSERT INTO [AccSync]
VALUES(NEWID(),GETDATE(),@End,ISNULL(@TransactionCount,0),DATEDIFF(SECOND,@End))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。