一个查询中有多个DATEADD函数 - TSQL

时间:2017-05-11 09:52:13

标签: sql sql-server tsql

我试图在随机日期进行多次编辑,以便在一系列日期(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

2 个答案:

答案 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语句。
  • 对于T-SQL代码,您可以使用rand(),而不是newid()解决方法(在单个查询中需要生成多个随机值)。
  • 不要使用日期部分缩写,例如" hh"。只需拼出日期部分即可。代码更容易编写和维护。