DECLARE @start DATE = '19700101', @end DATE = SYSDATETIME();
SELECT DATEADD
(
DAY,
(ABS(CHECKSUM(NEWID())) % (DATEDIFF(DAY, @start, @end)+1)),
@start
);
您可以使用其他方法来实现随机性,包括RAND()和CRYPT_GEN_RANDOM()。根据我的经验,它们中的任何一个分布都不是特别出色,并且有些在查询中的行为与其他的不同,因此根据您的需要,它们可能合适也可能不合适。我跟进了Paul White 的评论,但通过以下查询看到了同样糟糕的分布(当然分布质量也是范围大小的一个因素):
DECLARE @start DATE = '19700101', @end DATE = SYSDATETIME(), @r INT;
SET @r = RAND(CHECKSUM(NEWID())) * (DATEDIFF(DAY, @start, @end)+1);
SELECT DATEADD(DAY, @r, @start);
好吧,您真正需要做的就是确定您的日期范围,然后选择一个介于 0 和天数 (+1) 之间的随机数,然后在该范围的开头添加这么多天。
您可以使用其他方法来实现随机性,包括
RAND()
和CRYPT_GEN_RANDOM()
。根据我的经验,它们中的任何一个分布都不是特别出色,并且有些在查询中的行为与其他的不同,因此根据您的需要,它们可能合适也可能不合适。我跟进了Paul White 的评论,但通过以下查询看到了同样糟糕的分布(当然分布质量也是范围大小的一个因素):文档:
NEWID()
RAND()
CRYPT_GEN_RANDOM()
我在 SQL Server 中发现的唯一真正的随机化是获取一个表并通过 newid() 对其进行排序。因此,在这种情况下,请创建一个包含您希望有效的日期的表。然后