更新于 2025-10-18
SELECT DATEADD(day, ABS(CHECKSUM(NEWID())) % 10, GETDATE()) AS RandomDate;
-- 结果为:当前时间 + 随机 0 到 9 天
说明:ABS(CHECKSUM(NEWID())) % 10 会生成 0..9 的整数。NEWID() 每次调用通常是不同的,适合按行生成不同随机值。
DECLARE @min INT = 3, @max INT = 7;
SELECT DATEADD(day,
@min + ABS(CHECKSUM(NEWID())) % (@max - @min + 1),
GETDATE()) AS RandomDate;
-- 结果为:当前时间 + 随机 3 到 7 天
UPDATE dbo.YourTable
SET SomeDate = DATEADD(day, ABS(CHECKSUM(NEWID())) % 30, GETDATE())
WHERE ...;
说明:NEWID() 在每一行执行时都会产生不同值,因此每行会得到不同的随机偏移。
SELECT DATEADD(day, (ABS(CHECKSUM(NEWID())) % 11) - 5, GETDATE()) AS RandomDate;
-- %11 得到 0..10,然后减 5 得到 -5..+5
RAND() 在同一个查询批次内可能对多行返回相同值(行为依赖于是否带 seed),因此通常不适合按行生成不同随机值。
如果想用 RAND,可用 RAND(CHECKSUM(NEWID())) 强制不同种子,但 CHECKSUM(NEWID()) 的用法更直接且常见。
-- 例:0..9 天(注意:CAST varbinary->int 的行为请在你的版本/环境下验证)
SELECT DATEADD(day, ABS(CAST(CRYPT_GEN_RANDOM(4) AS int)) % 10, GETDATE()) AS RandomDate;
说明:CRYPT_GEN_RANDOM 返回二进制随机数据,可用于更高质量的随机性,但语法和可用性要在你的 SQL Server 版本上验证。
GETDATE() 返回 datetime(精度到毫秒);若需要更高精度可用 SYSDATETIME()(返回 datetime2)。
两者都基于数据库服务器时间,需注意时区/UTC 要求时使用 AT TIME ZONE 或在应用层处理。