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?
Réponses
Trop de publicités?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
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
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.
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)
)
)