如何编写更改数据库中所有日期字段的SQL Server查询?

时间:2017-08-02 00:59:38

标签: sql-server datetime

如何编写SQL Server查询,将数据库中datetime列中的所有字段更改为同一当前年份的随机日期?

2 个答案:

答案 0 :(得分:2)

此方法会将日期时间范围转换为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)

答案 1 :(得分:2)

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之间的随机数