我有一个简单的SQL表,它有一个DateTime列。我想用随机日期更新所有行(> 100000行)。有一种简单的方法来执行SQL查询吗?
答案 0 :(得分:72)
用它来生成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以避免在范围上限
时溢出答案 1 :(得分:51)
我将补充以下答案,
SELECT DATEADD(DAY, ABS(CHECKSUM(NEWID()) % 3650), '2000-01-01')
FROM your_table
这会生成从2000-01-01开始的日期,并且您可以更改模数值中的天数,我放3650(约10年),此方法不会溢出。
如果您想更新,那么
UPDATE your_table
SET your_date_field = DATEADD(DAY, ABS(CHECKSUM(NEWID()) % 3650), '2000-01-01')
WHERE your_conditions
答案 2 :(得分:32)
这个问题似乎很老,但我的回答可能对其他人有用。
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'))
这会在给定范围之间生成随机日期时间。
答案 3 :(得分:7)
我将Jhonny的答案改编成了过去10年的日期:
SELECT dateadd(day, (abs(CHECKSUM(newid())) % 3650) * -1, getdate())
请注意,这只是SQLServer。
答案 4 :(得分:5)
以下代码将填充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)
)
)
答案 5 :(得分:3)
我用它来为我所有的测试数据设定1940年到1985年之间的出生日期
SET [Birth Date] = DATEADD(day, (ABS(CHECKSUM(NEWID())) % 16250), '1940-1-1 00:00:00.001')
答案 6 :(得分:2)
我正在寻找一个类似于此的问题,这也产生了一个随机时间,我找到了这个脚本。认为它可能在这里有用:
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/
答案 7 :(得分:0)
使用下面的代码,您可以获得@Min(1)和@Max(365)之间的随机整数,然后使用dateadd funection,您可以在去年创建随机日期。
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())
答案 8 :(得分:0)
您可以尝试获取一个随机数(正数或负数),然后将该数字添加到日期(可能是系统日期)。
例如(我现在无法访问sqlserver,因此无法验证语法)
DATEADD(day, DATEDIFF(day, 0, GETDATE()) - 1 - FLOOR(RAND(CAST(NEWID() AS binary(4))) * 365.25 * 90), 0)
答案 9 :(得分: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;