如何用随机date更新行
我有一个简单的SQL表,它有一个DateTime列。 我想用随机date更新所有行(> 100000行)。 有一个简单的方法来做到这一点的SQL查询?
在1900年1月1日到2079年6月6日之间使用它来生成一个smalldatetime(未检查,SQL未安装)
DATEADD(day, (ABS(CHECKSUM(NEWID())) % 65530), 0)
NEWID更好,然后尝试使用RAND:RAND不会在单个SELECT或UPDATE中生成不同的值行(以及在行为发生变化的情况下,它不会在SQL 2000中)。
编辑:像这样
UPDATE table SET datetimecol = DATEADD(day, (ABS(CHECKSUM(NEWID())) % 65530), 0)
编辑:改变65535到65530,并增加了ABS,以避免范围的上限溢出
我将补充下面的答案,
SELECT DATEADD(DAY, ABS(CHECKSUM(NEWID()) % 3650), '2000-01-01') FROM your_table
这产生date从2000-01-01开始,你可以改变模数值的天数,我把3650(约10年),这种方法不溢出。
如果你想更新,那么
UPDATE your_table SET your_date_field = DATEADD(DAY, ABS(CHECKSUM(NEWID()) % 3650), '2000-01-01') WHERE your_conditions
这个问题似乎很古老,但我的答案可能对其他人有用。
Update table SET Time= DateAdd(d, ROUND(DateDiff(d, '2010-01-01', '2013-12-31') * RAND(CHECKSUM(NEWID())), 0), DATEADD(second,CHECKSUM(NEWID())%48000, '2010-01-01'))
这会在给定的范围之间生成一个随机的date时间。
下面的代码将使用两个给定date之间的随机date填充FiscalYear表的StartDate列:
-- First, let's declare the date range. DECLARE @date_from DATETIME; DECLARE @date_to DATETIME; -- Set the start and date dates. In this case, we are using -- the month of october, 2006. SET @date_from = '1985-10-14'; SET @date_to = '2009-04-27'; UPDATE FiscalYear SET StartDate = ( -- Remember, we want to add a random number to the -- start date. In SQL we can add days (as integers) -- to a date to increase the actually date/time -- object value. @date_from + ( -- This will force our random number to be >= 0. ABS ( -- This will give us a HUGE random number that -- might be negative or positive. CAST(CAST(NewID() AS BINARY(8)) AS INT) ) -- Our random number might be HUGE. We can't have -- exceed the date range that we are given. -- Therefore, we have to take the modulus of the -- date range difference. This will give us between -- zero and one less than the date range. % -- To get the number of days in the date range, we -- can simply substrate the start date from the -- end date. At this point though, we have to cast -- to INT as SQL will not make any automatic -- conversions for us. CAST((@date_to - @date_from) AS INT) ) )
我把Jhonny的答案改编成了过去10年的date:
SELECT dateadd(day, (abs(CHECKSUM(newid())) % 3650) * -1, getdate())
请注意,这只是SQLServer。
我用这个为我的所有testing数据设定了1940年到1985年之间的出生date
SET [Birth Date] = DATEADD(day, (ABS(CHECKSUM(NEWID())) % 1625), '1940-1-1 00:00:00.001')
我正在寻找类似的问题,也产生了一个随机的时间,我发现这个脚本。 认为这可能是有用的:
DECLARE @DateFrom DATETime = '2001-01-01' DECLARE @DateTo DATeTime = '2013-11-30' DECLARE @DaysRandom Int= 0 DECLARE @MillisRandom Int=0 --get random number of days select @DaysRandom= DATEDIFF(day,@DateFrom,@DateTo) SELECT @DaysRandom = ROUND(((@DaysRandom -1) * RAND()), 0) --get random millis SELECT @MillisRandom = ROUND(((99999999) * RAND()), 0) SELECT @DateTo = DATEADD(day, @DaysRandom, @DateFrom) SELECT @DateTo = DATEADD(MILLISECOND, @MillisRandom, @DateTo) SELECT @DateTo
我从这里得到它: http : //crodrigues.com/sql-server-generate-random-datetime-within-a-range/
使用下面的代码,你可以得到一个@Min(1)和@Max(365)之间的随机整数,然后使用dateaddfunction,你可以在去年创build随机date。
CREATE VIEW vRandNumber AS SELECT RAND() as RandNumber GO CREATE FUNCTION RandNumber(@Min int, @Max int) RETURNS int AS BEGIN RETURN round(@Min + (select RandNumber from vRandNumber) * (@Max-@Min),0) END GO Update table1 set theDate = dateadd(d,0-dbo.RandNumber(1,365),getdate())
你可以尝试获得一个随机数(正数或负数),然后将该数字添加到date(可能是系统date)。
例如(我现在没有访问sqlserver,所以我无法validation语法)
DATEADD(day, DATEDIFF(day, 0, GETDATE()) - 1 - FLOOR(RAND(CAST(NEWID() AS binary(4))) * 365.25 * 90), 0)
我为自己结合了几个答案,我认为这对你有用。 我花了40秒来执行这个140k行。 I5,1333MHZ,标准笔记本电脑硬盘
DECLARE @rank INT = 0; WHILE @rank < yourmaxrow --(you can use Select count (*) from your table name as well) BEGIN DECLARE @FromDate DATETIME = DATEADD(DAY, -720, GETDATE()) -- 2 years back DECLARE @ToDate DATETIME = DATEADD(DAY, -1, GETDATE()) -- until yesterday DECLARE @Seconds INT = DATEDIFF(SECOND, @FromDate, @ToDate) DECLARE @Random INT = ROUND(((@Seconds-1) * RAND()), 0) DECLARE @Milliseconds INT = ROUND((999 * RAND()), 0) update yourtablename Set yourdatetiemcolumnname = DATEADD(MILLISECOND, @Milliseconds, DATEADD(SECOND, @Random, @FromDate)) WHERE Id = @rank SET @rank = @rank + 1; END;