82 votes

Comment mettre à jour des lignes avec une date aléatoire

J'ai une table SQL simple qui a une colonne DateTime. Je voudrais mettre à jour toutes les lignes (> 100 000 lignes) avec une date aléatoire. Existe-t-il un moyen simple de faire une requête SQL?

103voto

gbn Points 197263

Utilisez-le pour générer une petite heure entre le 01 janvier 1900 et le 06 juin 2079 (non cochée, SQL non installé)

 DATEADD(day, (ABS(CHECKSUM(NEWID())) % 65530), 0)
 

NEWID est préférable à l’utilisation de RAND: RAND ne génère pas différentes valeurs dans une même commande SELECT ou UPDATE (ce qui n’a pas été le cas dans SQL 2000, au cas où le comportement aurait changé).

Edit: comme ça

 UPDATE
  table
SET
  datetimecol = DATEADD(day, (ABS(CHECKSUM(NEWID())) % 65530), 0)
 

Edit: modifié de 65535 à 65530 et ajouté du système ABS pour éviter les débordements à la limite supérieure de la plage

71voto

Je compléterai les réponses ci-dessous,

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

Cela génère des dates à partir du 01/01/2000, et vous pouvez modifier le nombre de jours dans la valeur du module, je mets 3650 (environ 10 ans), cette approche ne déborde pas.

Si vous voulez mettre à jour, alors

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

50voto

Pieter_Daems Points 121

Cette question semble assez ancienne mais ma réponse pourrait être utile à d’autres.

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

Cela génère une date / heure aléatoire entre une plage donnée.

8voto

Paul Cunningham Points 35

J'ai utilisé cela pour définir une date de naissance entre 1940 et 1985 pour toutes mes données de test

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

5voto

CSharper Points 3177

Le code suivant remplira la colonne StartDate de la table FiscalYear avec des dates aléatoires entre deux dates données:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X