我想从一个datetime
列的字段生成5个随机记录,并使用名为Orders
的表的存储过程包含给定日期范围的多个(OrderDate)记录
CREATE PROCEDURE test
@StartDate DATETIME = NULL,
@EndDate DATETIME = NULL,
AS
BEGIN
SELECT OrderDate = DATEADD(......)
FROM Orders
END
我可以得到一些帮助!
答案 0 :(得分:1)
while循环可以用于此目的,特别是如果您关注将随机性限制在有界日期范围内。 缺点是可能会执行许多插入查询而不是递归CTE的单个插入,如在另一个答案中那样。
create procedure dbo.spGenDates2
@MinDate datetime,
@MaxDate datetime,
@RecordCount int = 5
as
SET NOCOUNT ON;
DECLARE @Range int, @DayOffset int, @Cnt int
SET @Range = DATEDIFF(dd, @MinDate, @MaxDate)
SET @Cnt = 1
WHILE @Cnt <= @RecordCount
BEGIN
SET @DayOffset = RAND() * (@Range + 1)
INSERT INTO _test (Dt) VALUES(DATEADD(dd, @DayOffset, @MinDate))
SET @Cnt = @Cnt + 1
END
答案 1 :(得分:0)
根据您的语法,我假设您正在使用SQL Server ...
请注意,您无法在单个查询的上下文中可靠地使用sql随机数生成器函数RAND(),因为它不会每行重新接种,因此您最终会为每个行结果接收相同的单个随机数。相反,使用NEWID()转换为数字的方法可以在单个查询的执行中生成随机值。
这是一个程序,可以在近期为您提供n个样本日期。
create procedure dbo.spGenDates
@MaxDate datetime,
@RecordCount int = 5
as
WITH dates as (
SELECT DATEADD(MILLISECOND, ABS(CHECKSUM(NEWID())) * -1, @MaxDate) D,
1 as Cnt
UNION ALL
SELECT DATEADD(MILLISECOND, ABS(CHECKSUM(NEWID())) * -1, @MaxDate) D,
x.Cnt + 1 as Cnt
FROM dates x
WHERE x.Cnt < @RecordCount
)
INSERT INTO _test (Dt)
SELECT D
FROM dates
答案 2 :(得分:0)
该问题的措辞已经澄清(见另一个答案的评论),希望在一个有限范围内从表中选择5个随机抽样日期。
这样的查询将产生所需的结果。
SELECT TOP (5) OrderDate
FROM Orders
WHERE OrderDate >= @StartDate
AND OrderDate < @EndDate
ORDER BY NEWID()