通过SQL中的存储过程为datetime列生成随机记录

时间:2017-02-15 01:27:58

标签: sql sql-server

我想从一个datetime列的字段生成5个随机记录,并使用名为Orders的表的存储过程包含给定日期范围的多个(OrderDate)记录

CREATE PROCEDURE test
    @StartDate DATETIME = NULL,
    @EndDate DATETIME = NULL,
AS
BEGIN
    SELECT OrderDate = DATEADD(......)  
    FROM Orders
END

我可以得到一些帮助!

3 个答案:

答案 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()