Я думаю, что это должно сработать:
-- using NewID() instead of Rand() because Rand() is only interpreted once for the entre query while NewID() is for each record
-- Based on your logic I understand newStartDate had to be between 1 jan 1801 and 28 dec 1999
DECLARE @multiplier float
DECLARE @max_int float
DECLARE @daterange float
SELECT @max_int = Power(Convert(float, 2), 31), -- signed int !
@daterange = DateDiff(day, '1 jan 1801', '28 dec 1999')
UPDATE Treatments
SET @multiplier = (@max_int - Convert(real, ABS(BINARY_CHECKSUM(NewID())))) / @max_int, -- returns something between 0 and 1
StartDate = DateAdd(day, Convert(int, (@daterange * @multiplier)), '1 jan 1801') -- returns somewhere in the daterange
-- test 'spread'
SELECT COUNT(*), COUNT(DISTINCT StartDate), Min(StartDate), Max(StartDate) FROM Treatments
Если кто-то захочет проверить это, вы можете использовать это для генерации некоторых тестовых данных (@Kulingar: убедитесь, что не уронили вашу таблицу случайно =)
IF DB_ID('test') IS NULL CREATE DATABASE test
GO
USE test
GO
IF Object_ID('test..Treatments') IS NOT NULL DROP TABLE test..Treatments
GO
SELECT row_id = IDENTITY(int, 1, 1), StartDate = CURRENT_TIMESTAMP INTO Treatments FROM sys.columns, sys.objects