【问题标题】:How would I write a SQL Server query that changes all date field in the database?我将如何编写一个 SQL Server 查询来更改数据库中的所有日期字段?
【发布时间】:2017-08-02 00:59:37
【问题描述】:

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

【问题讨论】:

  • 查找 RAND()。有很多关于如何在 X 和 Y 之间获取随机数的帖子。我首先将月份更新为 1-12 之间的随机数。然后,根据月份数,将 rand 用于 2 月的 1-31 或 1-30 或 1-28 的范围。容易。

标签: sql-server datetime


【解决方案1】:
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 之间的随机数

【讨论】:

    【解决方案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)
    

    【讨论】:

    • 如果我的数据库名为 OnlineStore,我该怎么做才能影响该数据库中的所有表?
    • @ShreddedSaber 你必须动态
    • 我必须在您的示例中进行哪些更改才能使其具有动态性?
    • 是的。它不是一个重要的数据库。顺便说一句,感谢您对此的帮助。
    • @ShreddedSaber 这真是一种解脱。今晚我可以睡觉了。 ?
    猜你喜欢
    • 1970-01-01
    • 2011-07-13
    • 2020-05-03
    • 2011-12-09
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    相关资源
    最近更新 更多