【发布时间】:2017-08-02 00:59:37
【问题描述】:
我将如何编写一个 SQL Server 查询,将数据库中日期时间列中的所有字段更改为同一年份的随机日期?
【问题讨论】:
-
查找 RAND()。有很多关于如何在 X 和 Y 之间获取随机数的帖子。我首先将月份更新为 1-12 之间的随机数。然后,根据月份数,将 rand 用于 2 月的 1-31 或 1-30 或 1-28 的范围。容易。
标签: sql-server datetime
我将如何编写一个 SQL Server 查询,将数据库中日期时间列中的所有字段更改为同一年份的随机日期?
【问题讨论】:
标签: sql-server datetime
UPDATE t
SET datetime_column = DATEADD(DAY, abs(checksum(newid())) % 364, DATEADD(YEAR, DATEDIFF(YEAR, 0, datetime_column), 0))
FROM yourtable t
DATEADD() + DATEDIFF() 对将为您提供一年中的第一天
abs(checksum(newid())) % 365 将返回一个介于 0 和 364 之间的随机数
【讨论】:
这种方法会将日期时间范围转换为 FLOAT。然后我们简单地计算这两个值之间的随机数并将该随机值转换回日期时间
示例
Declare @D1 float = cast(cast('2017-01-01 00:00:00' as datetime) as float) -- 42734
Declare @D2 float = cast(cast('2017-12-31 23:59:59' as datetime) as float) -- 43098.9999884259
Select Top 10
RandomDate = cast(rand(cast( NewID() as varbinary ))*(@D2-@D1)+@D1 as datetime)
From master..spt_values A
退货
RandomDate
2017-06-03 02:01:28.650
2017-06-12 01:05:54.107
2017-04-29 14:23:00.160
2017-10-13 14:37:51.290
2017-10-29 16:35:20.723
2017-06-30 20:54:03.197
2017-08-31 22:46:20.440
2017-02-11 23:42:24.323
2017-04-22 06:31:48.477
2017-12-01 18:05:49.177
编辑 - 动态
Declare @SQL varchar(max) = '
Declare @D1 float = cast(cast(''2017-01-01 00:00:00'' as datetime) as float);
Declare @D2 float = cast(cast(''2017-12-31 23:59:59'' as datetime) as float);
'
Select @SQL=@SQL+';Update '+quotename(Table_Schema)+'.'+quotename(Table_Name)+' Set '+quotename(Column_Name)+'=cast(rand(cast( NewID() as varbinary ))*(@D2-@D1)+@D1 as datetime)'+char(13)
From INFORMATION_SCHEMA.COLUMNS
Where Data_Type='datetime'
and Table_Catalog = 'OnlineStore'
Print @SQL
--Exec(@SQL)
【讨论】: