我的表T1
有两个日期时间列(StartDate
,EndDate
),我必须在一种情况下填充随机日期:
EndDate
值必须在最短的一天内大于StartDate
。示例:
StartDate EndDate
===========================
2001-04-04 2001-04-06 (2 days)
2001-01-05 2001-01-15 (10 days)
.
.
.
我可以在一个声明中这样做吗?
P.S。我的第一个想法是将EndDate
列更改为NULL,并在第一步填充StartDate
将EndDate
保留为NULL,并在第二个语句中编写一些机制来更新EndDate
日期更长(每条记录的天数不同),然后StartDate
。
答案 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;