TSQL 使用 2 个日期之间的随机值更新日期时间

标签 tsql datetime random

在 TSQL 上更新包含 DATETIME 列且两个日期之间的 RANDOM 值的表的最简单方法是什么?

我看到各种与此相关的帖子,但当您在更新后ORDER BY DATE 时,它们的随机值实际上是连续的。

最佳答案

假设

首先假设您有一个数据库,其中包含一个包含开始日期时间列和结束日期时间列的表,它们共同定义了一个日期时间范围:

CREATE DATABASE StackOverflow11387226;
GO

USE StackOverflow11387226;
GO

CREATE TABLE DateTimeRanges (
  StartDateTime DATETIME NOT NULL,
  EndDateTime DATETIME NOT NULL
);
GO

ALTER TABLE DateTimeRanges
ADD CONSTRAINT CK_PositiveRange CHECK (EndDateTime > StartDateTime);

并假设该表包含一些数据:

INSERT INTO DateTimeRanges (
  StartDateTime,
  EndDateTime
)
VALUES
  ('2012-07-09 00:30', '2012-07-09 01:30'),
  ('2012-01-01 00:00', '2013-01-01 00:00'),
  ('1988-07-25 22:30', '2012-07-09 00:30');
GO

方法

以下 SELECT 语句返回开始日期时间、结束日期时间和分钟精度大于或等于开始日期时间且小于第二个日期时间的伪随机日期时间:

SELECT
  StartDateTime,
  EndDateTime,
  DATEADD(
    MINUTE,
    ABS(CHECKSUM(NEWID())) % DATEDIFF(MINUTE, StartDateTime, EndDateTime) + DATEDIFF(MINUTE, 0, StartDateTime),
    0
  ) AS RandomDateTime
FROM DateTimeRanges;

结果

因为 NEWID() 函数是不确定的,所以每次执行都会返回不同的结果集。这是我刚才生成的结果集:

StartDateTime           EndDateTime             RandomDateTime
----------------------- ----------------------- -----------------------
2012-07-09 00:30:00.000 2012-07-09 01:30:00.000 2012-07-09 00:44:00.000
2012-01-01 00:00:00.000 2013-01-01 00:00:00.000 2012-09-08 20:41:00.000
1988-07-25 22:30:00.000 2012-07-09 00:30:00.000 1996-01-05 23:48:00.000

RandomDateTime 列中的所有值都位于 StartDateTime 和 EndDateTime 列中的值之间。

说明

这种生成随机值的技术归功于 Jeff Moden。他写了一个great article关于数据生成的 SQL Server Central。阅读它以获得更详尽的解释。需要注册,但非常值得。

想法是从开始日期时间生成一个随机偏移量,并将偏移量添加到开始日期时间以获得介于开始日期时间和结束日期时间之间的新日期时间。

表达式 DATEDIFF(MINUTE, StartDateTime, EndDateTime) 表示开始日期时间和结束日期时间之间的总分钟数。偏移量必须小于或等于该值。

表达式 ABS(CHECKSUM(NEWID())) 为每一行生成一个独立的随机正整数。该表达式可以具有 0 到 2,147,483,647 之间的任何值。此表达式对第一个表达式进行模数运算,给出了以分钟为单位的有效偏移量。

表达式 DATEDIFF(MINUTE, 0, StartDateTime) 表示开始日期时间和引用日期时间 0 之间的总分钟数,这是 的简写>'1900-01-01 00:00:00.000'。引用日期时间的值无关紧要,但重要的是在整个表达式中使用相同的引用日期。将此添加到偏移量以获得引用日期时间之间的总分钟数。

封装的 DATEADD 函数通过将前一个表达式生成的分钟数添加到引用日期时间,将其转换为日期时间值。

关于TSQL 使用 2 个日期之间的随机值更新日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11387226/

相关文章:

sql-server - 如何从登录 SQL 向后计算行数?

sql - 在最近的单个日期连接两个表

sql - 当我得到错误 : The DELETE statement conflicted with the REFERENCE constraint 时,我可以显示冲突的主键吗?

java - 为日期格式声明字符串常量,而不是显式地编写字符串值

python - 读取时间序列 csv 文件以使用 matplotlib 进行绘图

python - 我怎样才能使我的 Django 应用程序的这篇随机博客文章重定向更有效率

sql - 合并两个具有不同 ORDER BY 的 SELECT 查询

android - 如何在查询 sqlite 时格式化 DateTime 列?

java - 随机与随机播放

java - Repaint() 方法不会重新绘制需要的内容