基于其他列的值的不重复的随机日期



我有一个名为#RandomDates的临时表,在SQLServer:中看起来像这样

╔════╦═════════════╦══════════╦══════════════════╦════════════════════════════════╦═══════════════════════╗
║ ID ║ Description ║ RaceType ║ RaceStartTime    ║ AverageCompletionTimeInMinutes ║ PredictCompletionTime ║
╠════╬═════════════╬══════════╬══════════════════╬════════════════════════════════╬═══════════════════════╣
║ 1  ║ Player1     ║ RaceA    ║ 2025-05-10 10:00 ║ 120                            ║ NULL                  ║
╠════╬═════════════╬══════════╬══════════════════╬════════════════════════════════╬═══════════════════════╣
║ 2  ║ Player2     ║ RaceA    ║ 2025-05-12 17:00 ║ 120                            ║ NULL                  ║
╠════╬═════════════╬══════════╬══════════════════╬════════════════════════════════╬═══════════════════════╣
║ 3  ║ Player3     ║ RaceC    ║ 2025-08-12 08:15 ║ 60                             ║ NULL                  ║
╠════╬═════════════╬══════════╬══════════════════╬════════════════════════════════╬═══════════════════════╣
║ 5  ║ Player4     ║ RaceY    ║ 2025-08-29 16:00 ║ 10                             ║ NULL                  ║
╠════╬═════════════╬══════════╬══════════════════╬════════════════════════════════╬═══════════════════════╣
║ 6  ║ Player4     ║ RaceY    ║ 2025-08-30 21:00 ║ 10                             ║ NULL                  ║
╚════╩═════════════╩══════════╩══════════════════╩════════════════════════════════╩═══════════════════════╝

我想更新列";预测完成时间";随机日期,但我需要它们基于值列的";RaceStartTime";以及";AverageCompletionTimeInMinutes";。

ID=1 的示例

  • 比赛将于2025-05-10 10:00举行
  • RaceA平均需要120分钟才能完成
  • 我想要我的随机化";预测完成时间";列介于:

RaceStartTime+AverageCompletionTimeInMinutes+随机添加或减去少量的分钟和秒(比如说5到10分钟(

因此此示例的有效日期可能是:

2025-05-10 12:07:20

2025-05-10 11:59:40

我试过用RAND((*来做这件事,但出于某种原因,我的";PredictCompletonTime";列不断更新每个RaceType的重复值

提前感谢

这里有一个例子,因此random将在第二秒内为每一行创建一个介于@MinTime和AverageCompletionTimeInMinutes之间的随机数,并将添加到RaceStartTime:

DECLARE @MinTime int = 300 -- in second
UPDATE #tablename
SET PredictCompletionTime =  DATEADD(SECOND ,ROUND(RAND() * (AverageCompletionTimeInMinutes*60 - @MinTime) , 0),RaceStartTime )
FROM #tablename

最新更新