如何在特定的包含范围内选择随机日期,比方说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_GEN_RANDOM(4) AS INT))
来生成随机数。不像RAND()
这是每个语句只评估一次,这是每行评估一次,所以会工作。
但是,似乎查询优化器没有意识到这一点,并将其视为一个常量。为了生成随机数据,这可能无关紧要(除非您填充受外键约束的列)
但我只是测试了替代ABS(CHECKSUM(NEWID()))
以查看是否有任何性能比另一个好。
典型的速度生成使用上面的数字表1,000,000行,并选择MAX
值(以避免返回所有这些行到客户端的开销)
ABS(CAST(CRYPT_GEN_RANDOM(4) AS INT))
/*CPU time = 4180 ms, elapsed time = 4395 ms.*/
ABS(CHECKSUM(NEWID()))
/*CPU time = 953 ms, elapsed time = 1163 ms.*/
(SELECT 1) /*A constant value just to get a baseline*/
/*CPU time = 499 ms, elapsed time = 457 ms.*/
所以,除非你需要加密安全PRNG它可能最好避免!
嗨马丁。非常感谢你。看起来,如果我想甚至'1992-12-31',我必须将@ d2声明为'2000-01-01',否则查询不包含最后一天。 – 2011-04-01 22:40:04
@nick - 我已将其更改为“1 + DATEDIFF(DAY,@ D1,@ D2)”以解决该问题。 – 2011-04-01 22:43:25
你简直太棒了:)谢谢你一直奉献我的时间。对此,我真的非常感激。再次感谢马丁。 – 2011-04-01 22:45:06
select DateAdd(d, ROUND(DateDiff(d, '1950-01-01', '1999-12-31') * RAND(), 0), '1950-01-01')
编辑
如果这是要为返回多行或更新的一部分,RAND()将整个结果集返回单个值的语句的一部分来执行。对于这种情况,可以使用RAND(CHECKSUM(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'
这似乎是随机选择1/1/1950或12/31/1999,但不是在两者之间的任何日期。 – JustinStolle 2011-04-01 22:36:25
嗨。感谢您的回复。我试过了你的查询,但它总是返回已经写入的那两个值中的一个。 – 2011-04-01 22:41:21
+1现在效果很好。谢谢;) – 2011-04-02 00:00:47
- 1. jQuery日期选择器,选择范围内的特定日期
- 2. 如何选择日期范围内的随机日期AS3
- 3. 选定的一个月内选择2日期范围(日期选择器)
- 4. 设置一个jQuery日期选择器来选择特定的日期范围
- 5. 在日期范围内选择元素
- 6. 在日期范围内选择宿舍
- 7. 在日期范围内选择数据
- 8. 选择具有特定范围的唯一随机数
- 9. PHP:多个唯一的随机整数在特定范围内
- 10. Java在特定范围内生成一个随机数?
- 11. 在特定日期范围内
- 12. SQlite:选择特定时间范围内的行,忽略日期
- 13. Excel:在两个日期范围内搜索特定日期
- 14. 选择日期范围内使用SQL
- 15. 选择日期范围内的数据
- 16. 将随机整数赋予特定范围内的选定行
- 17. 选择两个日期范围之间的特定记录
- 18. 日期范围选择
- 19. 日期范围选择器在结束范围内获取当前日期
- 20. Jquery Datepicker在一个日历中选择多个日期范围
- 21. 日期选择器日期范围
- 22. Q(KDB)在日期范围内选择今天的日期
- 23. 如何在一个范围内选择一个随机数 - +转换为ms
- 24. 的日期范围内选择一个最大值
- 25. 热得到随机日期范围
- 26. 如何从给定范围内选择随机值
- 27. 在日期范围内选择最新的限定类型
- 28. 无法从jquery datepicker日期范围选择器中选择一个日期范围在Selenium JAVA
- 29. 在一个日历中选择日期范围
- 30. SQL Server:在特定范围内的随机日期(包括随机小时,分钟,...)
您是否试图在同一时间为多行生成数据,或者只是一个日期?我只是想知道你是否试图建立一些测试数据插入到表中。 – Jeff 2011-04-01 22:34:39
嗨,杰夫。我需要一个范围内的随机日期,以便运行一个循环,并随机生成一个测试表。 :) – 2011-04-01 22:37:06
你需要多少行数据? – 2011-04-01 22:39:19