Ich versuche, mehrere Änderungen an einem zufälligen Datum zu machen, um eine vollständige zufällige Datetime innerhalb einer Reihe von Daten (3 Monate zurück, 3 Monate nach vorne) aber Einstellung der Stunden/Minuten/Sekunden/Millisekunden zu 0.Mehrere DATEADD-Funktionen in einer Abfrage - TSQL
Ich mache das, also kann ich dann eine zufällige Menge an Zeit hinzufügen, um Aktivitätsanfangs- und Endzeiten zu schaffen, die immer innerhalb der Büroarbeitsstunden passen. Das folgende Skript legt eine Variable für die Startzeit der Aktivität fest und führt dann 5 separate Änderungen an dieser Variablen durch, um das Zeitelement auf Null zu setzen.
Gibt es eine einfachere Möglichkeit, mehrere DATEADD-Bearbeitungen auszuführen, scheint es klobig zu sein!
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
N.B. In einer SET-Anweisung brauchen Sie die SELECTs nicht unbedingt vor jedem Aufruf einer Funktion (z. B. DATEADD). Wird den Code lesbarer machen. Ich weiß nicht über klobig, zumindest ist Ihr Code ziemlich klar. Sie könnten alle DateAdd-Anweisungen auf jede andere Zeile ketten, aber das würde nur eine schreckliche unlesbare Unordnung schaffen. – ADyson
Sehr geschätzt, und danke für den Tipp! – KEW