임의의 날짜로 행을 업데이트하는 방법
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
'program tip' 카테고리의 다른 글
스크럼 마스터는 하루 종일 무엇을합니까? (0) | 2020.11.26 |
---|---|
Ruby on Rails에서 두 DateTime 사이의 시간 (초)을 어떻게 얻습니까? (0) | 2020.11.26 |
jQuery, 다중으로 배열을 얻는 방법 (0) | 2020.11.26 |
난수 생성을위한 가장 안전한 시드는 무엇입니까? (0) | 2020.11.26 |
Ruby를 사용하여 명령을 5 번 실행하려면 어떻게해야합니까? (0) | 2020.11.26 |