Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 选择特定范围内的随机日期_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql server 选择特定范围内的随机日期

Sql server 选择特定范围内的随机日期,sql-server,sql-server-2008,Sql Server,Sql Server 2008,如何在特定的包含范围内选择随机日期,例如使用SQL Server选择“1950-01-01”和“1999-12-31”?这将为您提供1000行数据以供插入 DECLARE @D1 DATE = '19500101' DECLARE @D2 DATE = '19991231' ;WITH E00(N) AS (SELECT 1 UNION ALL SELECT 1), E02(N) AS (SELECT 1 FROM E00 a, E00 b), E04(N

如何在特定的包含范围内选择随机日期,例如使用SQL Server选择“1950-01-01”和“1999-12-31”?

这将为您提供1000行数据以供插入

DECLARE @D1 DATE = '19500101'
DECLARE @D2 DATE = '19991231'

   ;WITH E00(N) AS (SELECT 1 UNION ALL SELECT 1),
        E02(N) AS (SELECT 1 FROM E00 a, E00 b),
        E04(N) AS (SELECT 1 FROM E02 a, E02 b),
        E08(N) AS (SELECT 1 FROM E04 a, E04 b),
        E16(N) AS (SELECT 1 FROM E08 a, E08 b),
        E32(N) AS (SELECT 1 FROM E16 a, E16 b),
   cteTally(N) AS (SELECT ROW_NUMBER() OVER (ORDER BY N) FROM E32)
   SELECT TOP 1000
    DATEADD(DAY,ABS(CHECKSUM(NEWID())) % (1+DATEDIFF(DAY,@D1,@D2)),@D1)
   FROM  cteTally
注意:这个答案最初使用了
ABS(CAST(CRYPT\u GEN\u RANDOM(4)AS INT))
来生成随机数。与每个语句只计算一次的
RAND()

然而,查询优化者似乎没有意识到这一点,并将其视为常数。为了生成随机数据,这可能无关紧要(除非您正在填充受外键约束的列)

但是我刚刚测试了可选的
ABS(CHECKSUM(NEWID())
,看看两者之间是否有性能优势

使用上面的数字表生成1000000行并选择
MAX
值的典型速度(以避免将所有这些行返回到客户端的开销)

因此,除非您需要加密安全的PRNG,否则最好避免

select DateAdd(d, ROUND(DateDiff(d, '1950-01-01', '1999-12-31') * RAND(), 0), '1950-01-01')
编辑

如果这是作为返回多行的语句的一部分或作为update的一部分执行的,则RAND()将为整个结果集返回单个值。对于这种情况,可以使用RAND(校验和(NEWID()))

select DateAdd(d, ROUND(DateDiff(d, '1950-01-01', '1999-12-31') * RAND(), 0), '1950-01-01'),
       DateAdd(d, ROUND(DateDiff(d, '1950-01-01', '1999-12-31') * RAND(CHECKSUM(NEWID())), 0), '1950-01-01')
from master..spt_values where type = 'P'

您是要同时为多行构建数据,还是仅为一个日期构建数据?我只是想知道您是否正在尝试建立一些测试数据以插入到表中。嗨,Jeff。我需要一个范围内的随机日期,以便运行循环并用随机出生日期填充测试表。:)您需要多少行数据?这似乎是随机选择1950年1月1日或1999年12月31日,但这两者之间没有任何日期。您好。谢谢你的回复。我尝试过你的查询,但它总是返回已经写入的两个值中的一个。修改上面的内容,例如
选择DateAdd(d,ROUND(DateDiff(d,'1950-01-01','1999-12-31')*RAND(CHECKSUM(NEWID())),0),'1950-01-01')
以获取随机值作为更新语句的一部分。你好,Martin。非常感谢你。似乎如果我想要“1992-12-31”,我必须将@d2声明为“2000-01-01”,否则查询不包括最后一天。@尼克-我已经将其更改为
1+DATEDIFF(day,@D1,@d2)
来解决这个问题。你太棒了:)谢谢你一直以来为我付出的时间。我真的很感激。再次谢谢你,马丁。我已经完成了每天的投票。我甚至会在明天投票:)
select DateAdd(d, ROUND(DateDiff(d, '1950-01-01', '1999-12-31') * RAND(), 0), '1950-01-01'),
       DateAdd(d, ROUND(DateDiff(d, '1950-01-01', '1999-12-31') * RAND(CHECKSUM(NEWID())), 0), '1950-01-01')
from master..spt_values where type = 'P'