使用具有随机日期的两个日期时间列填充表

时间:2013-09-25 11:37:14

标签: tsql sql-server-2012

我的表T1有两个日期时间列(StartDateEndDate),我必须在一种情况下填充随机日期:

  • EndDate值必须在最短的一天内大于StartDate

示例:

StartDate           EndDate
===========================
2001-04-04          2001-04-06  (2 days)
2001-01-05          2001-01-15  (10 days)
.
.
.

我可以在一个声明中这样做吗?

P.S。我的第一个想法是将EndDate列更改为NULL,并在第一步填充StartDateEndDate保留为NULL,并在第二个语句中编写一些机制来更新EndDate日期更长(每条记录的天数不同),然后StartDate

3 个答案:

答案 0 :(得分:2)

这是一个只需一步填充表格的解决方案:

insert into T1 (StartDate, EndDate)
select 
    X.StartDate,
    dateadd(day, abs(checksum(newid())) % 10, X.StartDate) EndDate
from  (
    select top 20
        dateadd(day, -abs(checksum(newid())) % 100, convert(date, getDate())) StartDate
    from sys.columns c1, sys.columns c2
) X

上面的查询使用了我个人经常在临时SQL查询中使用的一些技巧:

  • new_Id()为每一行生成不同的随机值,而不是RAND(),每个查询将对其进行一次评估。表达式abs(checksum(newid())) % N将生成0 - N-1范围内的随机整数值。
  • TOP X ... FROM sys.columns c1, sys.columns c2技巧允许您生成X行,其值可以由标量值组成,如我们示例中的那些。

显然,您可以将上述查询中的硬编码值修改为:

  • 生成更多行
  • 增加随机开始日期的范围
  • 增加每行的最长持续时间。

答案 1 :(得分:1)

使用rand()函数的简单方法:

<强> Fiddle Example

declare @records int = 100, --Number of records needed 
        @count int = 0, @start int, @end int

while(@records>@count)
begin
    select @start = rand() * 10, @end = rand() * 100, @count+=1
    insert into mytable
    select dateadd(day, @start, getdate()),dateadd(day, @end, getdate())
end

select * from mytable

答案 2 :(得分:1)

INSERT T1 (StartDate, EndDate)
  select T1, T1 + add_days
  from 
  (select DATEADD(day, (ABS(CHECKSUM(NEWID())) % 65530), 0) T1,
          ROW_NUMBER() OVER(ORDER BY number) add_days
   from [ master ] .. spt_values) X;

sqlfiddle示例