4

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

  • EndDate值必须大于StartDate最小 1 天。

例子:

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

我可以在一份声明中做到这一点吗?

PS我的第一个想法是将列更改为EndDateNULL,并在第一步填充为NULL,并在第二个语句中编写一些机制来更新日期(每条记录的天数不同)然后。StartDateEndDateEndDateStartDate

4

3 回答 3

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

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

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

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

  • 生成更多行
  • 增加随机开始日期的范围
  • 增加每行的最大持续时间。
于 2013-09-25T11:50:51.307 回答
1

一些简单的使用rand()功能:

小提琴示例

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
于 2013-09-25T12:03:55.217 回答
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示例

于 2013-09-25T12:35:46.793 回答