[SQL] 임의의 날짜 행을 업데이트하는 방법
SQL임의의 날짜 행을 업데이트하는 방법
나는 날짜 시간 열이있는 간단한의 SQL 테이블을 가지고있다. 나는 임의의 날짜 모든 행 (> 100,000 행)를 업데이트하고 싶습니다. 이것을 SQL 쿼리를 할 수있는 간단한 방법이 있나요?
해결법
-
==============================
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.나는 아래의 답변을 보완
나는 아래의 답변을 보완
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.이 질문은 상당히 오래된 것 같다하지만 내 대답은 다른 사람에게 유용 할 수 있습니다.
이 질문은 상당히 오래된 것 같다하지만 내 대답은 다른 사람에게 유용 할 수 있습니다.
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.나는 지난 10 년부터 날짜를 얻을 수 위의 조니의 답변을 적응 :
나는 지난 10 년부터 날짜를 얻을 수 위의 조니의 답변을 적응 :
SELECT dateadd(day, (abs(CHECKSUM(newid())) % 3650) * -1, getdate())
이것은 단지 SQLServer에 유의하십시오.
-
==============================
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.내 테스트 데이터 모두를 위해 1940 년과 1985 년 사이에 출생의 날짜를 설정하려면이 옵션을 사용
내 테스트 데이터 모두를 위해 1940 년과 1985 년 사이에 출생의 날짜를 설정하려면이 옵션을 사용
SET [Birth Date] = DATEADD(day, (ABS(CHECKSUM(NEWID())) % 16250), '1940-1-1 00:00:00.001')
-
==============================
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.당신은 다음 날짜 (아마도 시스템 날짜)에 해당 번호를 추가하는 임의의 수 (양 또는 음)을 받고 시도 할 수 있습니다.
당신은 다음 날짜 (아마도 시스템 날짜)에 해당 번호를 추가하는 임의의 수 (양 또는 음)을 받고 시도 할 수 있습니다.
예를 들어 (지금은 SQLSERVER에 액세스 할 수 없습니다 그래서 구문을 확인할 수 없습니다)
DATEADD(day, DATEDIFF(day, 0, GETDATE()) - 1 - FLOOR(RAND(CAST(NEWID() AS binary(4))) * 365.25 * 90), 0)
-
==============================
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.나 자신에 대한 몇 가지 답변을 결합, 나는 당신을 위해 일을 생각한다. 나 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;
from https://stackoverflow.com/questions/794637/how-to-update-rows-with-a-random-date by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 GROUP BY를 사용하여 각 그룹의 최신 기록을 얻으려면? [복제] (0) | 2020.05.08 |
---|---|
[SQL] 가장 최근의 기록을 검색하는 SQL 쿼리를 작성 (0) | 2020.05.08 |
[SQL] 다른 하나 개의 테이블에서 SQL 데이터를 이동 (0) | 2020.05.08 |
[SQL] SQL에서 UPDATE가 DELETE +의 INSERT보다 항상 빠른? (0) | 2020.05.08 |
[SQL] MySQL은 - 방법은 문자열의 일부를 업데이트하려면? (0) | 2020.05.08 |