Gibt es eine einfachere Möglichkeit, eine DateTime in SQL server auf 23:59:59 zu setzen

Guten Morgen alle,

Ich versuche, eine SQL gespeicherte Prozedur umzubuild. Ich bin kein SQL-Experte, aber etwas sagt mir, dass es einen besseren path geben muss, dies zu tun.

IF @ipv_dtEndDate IS NOT NULL BEGIN SET @ipv_dtEndDate = DATEADD(hh,23,@ipv_dtEndDate) SET @ipv_dtEndDate = DATEADD(mi,59,@ipv_dtEndDate) SET @ipv_dtEndDate = DATEADD(ss,59,@ipv_dtEndDate) END 

Dieser Wert wird später in einer WHERE Klausel verwendet. Diese Filter scheinen mir schwer zu verstehen. Ich hatte gehofft, eine sauberere Umsetzung zu finden.

 AND qtrh.StatusTime <= IsNull(@ipv_dtEndDate, qtrh.StatusTime) 

Und diese datesberechnung …

 AND DATEDIFF(ss,qtrh.StatusTime,ISNULL(@dtNow,DATEADD(ss,-1,qtrh.StatusTime))) < DATEDIFF(ss,ISNULL(@dtDateOptionCompare,GETDATE()),GETDATE()) 

… scheint ziemlich gewunden und unlesbar. Wenn irgendwelche SQL-Gurus da draußen einige Vorschläge haben, wie ich das verbessern kann, würde ich gerne einige Ideen hören. Dank für Ihre time. Haben Sie ein tolles Urlaubswochenende.

Prost,
~ ck in San Diego

Wenn die einzige Verwendung von @ipv_dtEndDate innerhalb der Where-Klausel ist, können Sie den gesamten IF @ipv_dtEndDate IS NOT NULL Block entfernen und die Bedingung in der SQL-Abfrage durch:

 AND qtrh.StatusTime < DATEADD(dd,1,IsNull(@ipv_dtEndDate, qtrh.StatusTime)) 

(Streng genommen werden Sie nun auch StatusTime-Werte zwischen 23:59:59 und 00:00:00 enthalten, die bisher ausgeschlossen wurden.)

Wie wäre es damit?

 SET @ipv_dtEndDate = CONVERT(varchar, @ipv_dtEndDate, 101) + ' 23:59:59' 

Normalerweise verwende ich <und das date für den nächsten Tag, anstatt zu versuchen, ein <+ mit der letzten Sekunde von Mitternacht zu laufen.

Du könntest das date in Varchar umwandeln, dein "23:59:59" hinzufügen und es dann wieder in datetime umwandeln

Wenn du dich mit dem varchar-Ansatz nicht wohl fühlst, kannst du folgendes machen

 SET @ipv_dtEndDate = DATEADD(ss, DATEDIFF(ss, 0, '11:59:59'), @ipv_dtEndDate) 

Um ein date ohne time zu konvertieren (eher mit der time, die auf "Mitternacht am Morgen" eingestellt ist) zum "Ende des Tages" können Sie einfach die Anzahl der Sekunden hinzufügen:

 DECLARE @ipv_dtEndDate datetime SET @ipv_dtEndDate = 'Sep 3, 2010' PRINT convert(varchar(50), @ipv_dtEndDate, 109) -- Before SET @ipv_dtEndDate = dateadd(ss, 1439, @ipv_dtEndDate) PRINT convert(varchar(50), @ipv_dtEndDate, 109) -- After 

Natürlich ist SQL datetime genau auf die [333rd of a] Millisekunde, so dass das Ende des Tages tatsächlich ist:

 DECLARE @ipv_dtEndDate datetime SET @ipv_dtEndDate = 'Sep 3, 2010' PRINT convert(varchar(50), @ipv_dtEndDate, 109) -- Before SET @ipv_dtEndDate = dateadd(ms, 1439997, @ipv_dtEndDate) PRINT convert(varchar(50), @ipv_dtEndDate, 109) -- After 

Die Verwendung der eingebauten (und mathematisch basierten) dates- / timefunktionen wird effizienter sein als das Umwandeln in characterfolgen und zurück.

Dies wird die aktuelle time für heute zurückgeben :

 SELECT DATEADD(ms, -2, DATEADD(dd, 1, DATEDIFF(dd, 0, GETDATE()))) 

GETDATE() einfach GETDATE() mit was auch immer du willst. Also, in deinem Beispiel:

 AND qtrh.StatusTime <= DATEADD(ms, -2, DATEADD(dd, 1, DATEDIFF(dd, 0, @ipv_dtEndDate)))