Как обновить строки со случайной датой - PullRequest
61 голосов
/ 27 апреля 2009

У меня есть простая таблица SQL, которая имеет столбец DateTime. Я хотел бы обновить все строки (> 100000 строк) со случайной датой. Есть ли простой способ сделать это SQL-запрос?

Ответы [ 10 ]

72 голосов
/ 27 апреля 2009

Используйте это для генерации небольшого времени между 01 января 1900 и 06 июня 2079 года (не проверено, 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, чтобы избежать переполнения в верхней границе диапазона

51 голосов
/ 27 апреля 2009

Я дополню ответы ниже,

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
32 голосов
/ 07 мая 2013

Этот вопрос кажется довольно старым, но мой ответ может быть полезным для других.

      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'))

Генерирует случайную дату / время между заданным диапазоном.

7 голосов
/ 21 ноября 2014

Я адаптировал ответ Джонни выше, чтобы получить даты из 10 лет в прошлом:

SELECT dateadd(day, (abs(CHECKSUM(newid())) % 3650) * -1, getdate())

Обратите внимание, что это только SQLServer.

5 голосов
/ 27 апреля 2009

Следующий код заполнит столбец StartDate таблицы FiscalYear случайными датами между двумя указанными датами:

-- 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)
    )
)
3 голосов
/ 12 августа 2013

Я использовал это, чтобы установить дату рождения между 1940 и 1985 для всех моих тестовых данных

SET [Birth Date] = DATEADD(day, (ABS(CHECKSUM(NEWID())) % 16250), '1940-1-1 00:00:00.001')
2 голосов
/ 01 декабря 2013

Я искал вопрос, похожий на этот, который также генерировал случайное время, и я нашел этот скрипт. Думал, что это может быть полезно здесь:

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/

0 голосов
/ 25 июня 2016

Я собрал несколько ответов для себя, я думаю, что это работает для вас. Мне потребовалось 40 секунд, чтобы выполнить это для 140 тыс. Строк. i5, 1333 МГц, стандартный ноутбук, жесткий диск

 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;
0 голосов
/ 27 апреля 2009

вы можете попытаться получить случайное число (положительное или отрицательное), а затем добавить это число к дате (возможно, системной дате).

Например (сейчас у меня нет доступа к sqlserver, поэтому я не могу проверить синтаксис)

DATEADD(day, DATEDIFF(day, 0, GETDATE()) - 1 - FLOOR(RAND(CAST(NEWID() AS binary(4))) * 365.25 * 90), 0)
0 голосов
/ 27 апреля 2009

Используя приведенный ниже код, вы можете получить случайное целое число между @Min (1) и @Max (365), затем, используя функцию dateadd, вы можете создавать случайные даты за последний год.

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())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...