복붙노트

[SQL] 임의의 날짜 행을 업데이트하는 방법

SQL

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

나는 날짜 시간 열이있는 간단한의 SQL 테이블을 가지고있다. 나는 임의의 날짜 모든 행 (> 100,000 행)를 업데이트하고 싶습니다. 이것을 SQL 쿼리를 할 수있는 간단한 방법이 있나요?

해결법

  1. ==============================

    1.1900 1월 1일 및 2079 6월 6일 사이 smalldatetime으로를 생성 할 때 사용 (선택하지, 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)
    

    편집 : 65530 65535 변경 및 추가 ABS 범위의 상한에 오버 플로우 방지하기 위해

  2. ==============================

    2.나는 아래의 답변을 보완

    나는 아래의 답변을 보완

    SELECT DATEADD(DAY, ABS(CHECKSUM(NEWID()) % 3650), '2000-01-01')
    FROM your_table
    

    이 2000-01-01부터 시작 날짜를 생성하고,이 계수 값에 일의 양을 변경할 수 있습니다, 나는이 방법은 오버 플로우하지 않습니다 (10 년에 대해) 3650을 넣어.

    당신은 다음을 업데이트하려면

    UPDATE your_table
    SET your_date_field = DATEADD(DAY, ABS(CHECKSUM(NEWID()) % 3650), '2000-01-01')
    WHERE your_conditions
    
  3. ==============================

    3.이 질문은 상당히 오래된 것 같다하지만 내 대답은 다른 사람에게 유용 할 수 있습니다.

    이 질문은 상당히 오래된 것 같다하지만 내 대답은 다른 사람에게 유용 할 수 있습니다.

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

    이 주어진 범위 사이의 임의의 날짜를 생성한다.

  4. ==============================

    4.나는 지난 10 년부터 날짜를 얻을 수 위의 조니의 답변을 적응 :

    나는 지난 10 년부터 날짜를 얻을 수 위의 조니의 답변을 적응 :

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

    이것은 단지 SQLServer에 유의하십시오.

  5. ==============================

    5.다음 코드는 지정된 두 날짜 사이의 임의의 날짜와 FiscalYear 테이블의 STARTDATE 열을 채울 것입니다 :

    다음 코드는 지정된 두 날짜 사이의 임의의 날짜와 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)
        )
    )
    
  6. ==============================

    6.내 테스트 데이터 모두를 위해 1940 년과 1985 년 사이에 출생의 날짜를 설정하려면이 옵션을 사용

    내 테스트 데이터 모두를 위해 1940 년과 1985 년 사이에 출생의 날짜를 설정하려면이 옵션을 사용

    SET [Birth Date] = DATEADD(day, (ABS(CHECKSUM(NEWID())) % 16250), '1940-1-1 00:00:00.001')
    
  7. ==============================

    7.또한 임의의 시간을 생성 나는이 스크립트를 발견이 비슷한 질문을 찾고 있었다. 그것은 여기에 유용 할 수 있습니다 생각 :

    또한 임의의 시간을 생성 나는이 스크립트를 발견이 비슷한 질문을 찾고 있었다. 그것은 여기에 유용 할 수 있습니다 생각 :

    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/

  8. ==============================

    8.당신은 다음 날짜 (아마도 시스템 날짜)에 해당 번호를 추가하는 임의의 수 (양 또는 음)을 받고 시도 할 수 있습니다.

    당신은 다음 날짜 (아마도 시스템 날짜)에 해당 번호를 추가하는 임의의 수 (양 또는 음)을 받고 시도 할 수 있습니다.

    예를 들어 (지금은 SQLSERVER에 액세스 할 수 없습니다 그래서 구문을 확인할 수 없습니다)

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

    9.당신이 아래의 코드를 사용하면 다음 작년에 임의의 날짜를 만들 수 DATEADD funection를 사용하여, @min (1) @Max (365) 사이의 임의의 정수를 얻을 수 있습니다.

    당신이 아래의 코드를 사용하면 다음 작년에 임의의 날짜를 만들 수 DATEADD funection를 사용하여, @min (1) @Max (365) 사이의 임의의 정수를 얻을 수 있습니다.

    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())
    
  10. ==============================

    10.나 자신에 대한 몇 가지 답변을 결합, 나는 당신을 위해 일을 생각한다. 나 140K 행에 대해이 작업을 실행하는 것은 40 초 걸렸습니다. I5, 1333MHz의,의 standart 노트북 하드 디스크

    나 자신에 대한 몇 가지 답변을 결합, 나는 당신을 위해 일을 생각한다. 나 140K 행에 대해이 작업을 실행하는 것은 40 초 걸렸습니다. I5, 1333MHz의,의 standart 노트북 하드 디스크

     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;
    
  11. from https://stackoverflow.com/questions/794637/how-to-update-rows-with-a-random-date by cc-by-sa and MIT license