我试图在随机日期进行多次编辑,以便在一系列日期(3个月后,3个月前进)中保留完整的随机日期时间,但将小时/分钟/秒/毫秒设置为0。
我这样做,所以我可以随机添加一段时间来创建活动的开始和结束时间,这些时间总是适合办公室工作时间。下面的脚本为活动的开始时间设置一个变量,然后对该变量执行5次单独的编辑,将时间元素归零。
是否有更简单的方法来执行多个DATEADD编辑,看起来很笨重!
DECLARE @STARTTIME DATETIME
DECLARE @ENDTIME DATETIME
SET @STARTTIME = (SELECT DATEADD(DAY,ABS(CHECKSUM(NEWID()) % 180), (select dateadd(dd, -90, getdate()) )))
SET @STARTTIME = (SELECT DATEADD(HH, - (SELECT DATEPART(HH,@STARTTIME)),@STARTTIME))
SET @STARTTIME = (SELECT DATEADD(MI, - (SELECT DATEPART(MI,@STARTTIME)),@STARTTIME))
SET @STARTTIME = (SELECT DATEADD(SS, - (SELECT DATEPART(SS,@STARTTIME)),@STARTTIME))
SET @STARTTIME = (SELECT DATEADD(MS, - (SELECT DATEPART(MS,@STARTTIME)),@STARTTIME))
SET @STARTTIME = (SELECT DATEADD(hh,(SELECT FLOOR(RAND()*(15-08)+08)), @STARTTIME))
SET @ENDTIME = (SELECT DATEADD(hh,(SELECT FLOOR(RAND()*(3-1)+1)), @STARTTIME))
SELECT
@STARTTIME AS 'STARTTIME',
@ENDTIME AS 'ENDTIME'
Results
STARTIME 2017-04-02 13:00:00.000
ENDTIME 2017-04-02 15:00:00.000
答案 0 :(得分:2)
您将其转换为日期数据类型会将时间部分设置为00:00:000
DECLARE @STARTTIME DATETIME
DECLARE @ENDTIME DATETIME
SET @STARTTIME = cast((SELECT DATEADD(DAY,ABS(CHECKSUM(NEWID()) % 180), (select dateadd(dd, -90, getdate()) ))) as date)
SET @STARTTIME = (SELECT DATEADD(hh,(SELECT FLOOR(RAND()*(15-08)+08)), @STARTTIME))
SET @ENDTIME = (SELECT DATEADD(hh,(SELECT FLOOR(RAND()*(3-1)+1)), @STARTTIME))
SELECT
@STARTTIME AS 'STARTTIME',
@ENDTIME AS 'ENDTIME'
答案 1 :(得分:2)
无需在T-SQL代码中使用newid()
。只在查询中需要生成多个随机数。
所以:
set @starttime = cast(datedd(day, floor(rand() * 180 - 90), getdate()) as date);
set @starttime = dateadd(hour, floor(rand()*(15-08)+08), @starttime);
set @enddtime = dateadd(hour, floor(rand()*(3-1)+1), @starttime);
注意:
cast(. . . as date)
删除日期的时间部分。select
语句。rand()
,而不是newid()
解决方法(在单个查询中需要生成多个随机值)。