program tip

임의의 날짜로 행을 업데이트하는 방법

radiobox 2020. 11. 26. 08:07
반응형

임의의 날짜로 행을 업데이트하는 방법


DateTime 열이있는 간단한 SQL 테이블이 있습니다. 임의의 날짜로 모든 행 (> 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

이것은 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'))

이것은 주어진 범위 사이에서 임의의 날짜 시간을 생성합니다.


위의 Jhonny의 답변을 적용하여 10 년 전의 날짜를 얻었습니다.

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

이것은 SQLServer 전용입니다.


다음 코드는 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)
    )
)

모든 테스트 데이터에 대해 1940 년에서 1985 년 사이에 생년월일을 설정하는 데 사용했습니다.

SET [Birth Date] = DATEADD(day, (ABS(CHECKSUM(NEWID())) % 16250), '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) 사이의 임의의 정수를 얻은 다음 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())

you can try getting a random number (positive or negative) then adding that number to a date (possibly system date).

For example (I don't have access to sqlserver right now so I could not verify syntax)

DATEADD(day, DATEDIFF(day, 0, GETDATE()) - 1 - FLOOR(RAND(CAST(NEWID() AS binary(4))) * 365.25 * 90), 0)

I combined several answers for myself, I think it it work for you. It took 40 seconds for me to execute this for 140k rows. i5, 1333MHZ, standart laptop hdd

 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;

참고URL : https://stackoverflow.com/questions/794637/how-to-update-rows-with-a-random-date

반응형