2017-05-11 48 views
0

我試圖在隨機日期上進行多個編輯以在日期範圍內(3個月後,3個月前)留下完整的隨機日期時間,但將小時/分鐘/秒/毫秒爲0.多個DATEADD函數在一個查詢中 - TSQL

我這樣做,以便隨後添加隨機數量的時間來創建始終適合辦公室工作時間的活動開始和結束時間。下面的腳本爲活動的開始時間設置一個變量,然後對該變量執行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

N.B.在SET語句中,在每次調用函數(例如DATEADD)之前,並不嚴格需要SELECT。將使代碼更易讀。我不知道笨重,至少你的代碼很清楚。您可以將所有的DateAdd語句鏈接在一條線上,但這隻會產生一個可怕的不可讀的混亂。 – ADyson

+0

非常感謝,並感謝您的提示! – KEW

回答

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」等日期部分縮寫。只是拼出日期部分。代碼更容易編寫和維護。
+0

這是很好的建議,謝謝。你的解決方案也比我做得更容易!我編輯了CAST行以使其起作用:set @starttime = cast(dateadd(day,floor(rand()* 180 - 90),getdate())as date); – KEW

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' 
+0

謝謝你,這完全按照問題和解決我的問題。道歉,我已經爲戈登提供瞭解決方案,這對未來的用戶來說是一個更完整的答案。再次感謝! – KEW

相關問題