如何获取特定日期的随机Datetime?SQL查询偶现日期偏差问题求助
问题原因分析
你的查询偶尔出现前一天日期的问题,根源在CHECKSUM(NEWID()) % 24000这部分:
CHECKSUM(NEWID())会生成随机的正负整数,当它为负数时,对24000取模的结果也会是负数(比如-1 % 24000 = -1)- 用这个负数秒数执行
DATEADD(second, ..., @fromDate),会把日期往前偏移,比如DATEADD(second, -1, '2018-04-07')会得到2018-04-06 23:59:59,看起来就是前一天的日期了。
另外你原查询里DATEDIFF(day, @fromDate, @fromDate)的结果是0,这部分完全可以去掉——0乘以任何随机数还是0,对最终日期偏移没有影响。
修正后的查询
要确保生成的时间偏移始终是非负数,且覆盖一天内的所有时间(一天有86400秒),可以用ABS()函数取绝对值,再对86400取模:
DECLARE @RandomDate datetime DECLARE @fromDate datetime='2018-04-07' -- 生成0到86399之间的随机秒数,确保不会出现负数偏移 SELECT @RandomDate = DATEADD(second, ABS(CHECKSUM(NEWID())) % 86400, @fromDate) SELECT @RandomDate
修改后,生成的@RandomDate一定会是2018-04-07当天的任意时间,不会再出现前一天的情况。
如果需要更精确的随机时间(比如到毫秒级别),可以把秒数换成毫秒(一天有86400000毫秒):
DECLARE @RandomDate datetime DECLARE @fromDate datetime='2018-04-07' SELECT @RandomDate = DATEADD(millisecond, ABS(CHECKSUM(NEWID())) % 86400000, @fromDate) SELECT @RandomDate
内容的提问来源于stack exchange,提问作者Sunny Sandeep
相关产品推荐
相关产品推荐

