Ich habe ein kleines Problem mit meiner SQL-Abfrage. Ich verwende die GETDATE-Funktion. Nehmen wir jedoch an, ich führe das Skript um 17:00 Uhr aus. Es werden Datensätze zwischen dem 12.12.2011, 17:00 Uhr und dem 18.12.2011, 17:00 Uhr abgerufen. Wie kann ich dafür sorgen, dass Rekorde für den gesamten 12.12.2011 - 18.12.2011 abgerufen werden?
Mein Skript:
WHERE Orders.OrderStatus = 'Shipped'
AND Orders.ShipDate > (GETDATE()-6)
sql
sql-server
sql-server-2005
getdate
Henryaaron
quelle
quelle
Hier ist das Einfachste, was ich gefunden habe
-- Midnight floor of current date SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE()))
Der DATEDIFF gibt die ganzzahlige Anzahl von Tagen vor oder seit 1900-1-1 zurück, und die Convert Datetime bringt sie verbindlich auf dieses Datum um Mitternacht zurück.
Da DateDiff eine Ganzzahl zurückgibt, können Sie Tage addieren oder subtrahieren, um den richtigen Offset zu erhalten.
SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE()) + @dayOffset)
Das rundet nicht ab, das schneidet ab ... Aber ich denke, das wird gefragt. (Um eine zu runden, fügen Sie eine hinzu und schneiden Sie sie ab ... und das rundet auch nicht die Decke ab, sondern höchstwahrscheinlich das, was Sie wollen. Um wirklich zu runden, fügen Sie 0,5 hinzu (funktioniert das?) Und schneiden Sie ab.
Es stellt sich heraus, dass Sie GetDate () .5 hinzufügen können, und es funktioniert wie erwartet.
-- Round Current time to midnight today or midnight tomorrow SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE() + .5))
Ich habe alle meine Versuche mit SQL Server 2008 durchgeführt, aber ich denke, diese Funktionen gelten auch für 2005.
quelle
where [ScanDate] >= convert(datetime, datediff(day, 0, getdate())) and [ScanDate] < convert(datetime, datediff(day, -1, getdate()))
-- -- SQL DATEDIFF getting midnight time parts -- SELECT GETDATE() AS Now, Convert(DateTime, DATEDIFF(DAY, 0, GETDATE())) AS MidnightToday, Convert(DateTime, DATEDIFF(DAY, -1, GETDATE())) AS MidnightNextDay, Convert(DateTime, DATEDIFF(DAY, 1, GETDATE())) AS MidnightYesterDay go Now MidnightToday MidnightNextDay MidnightYesterDay -------------------- --------------------- --------------------- --------------------- 8/27/2014 4:30:22 PM 8/27/2014 12:00:00 AM 8/28/2014 12:00:00 AM 8/26/2014 12:00:00 AM
quelle
SELECT getdate()
Ergebnis: 2012-12-14 16: 03: 33.360
SELECT convert(datetime,convert(bigint, getdate()))
Ergebnis 15.12.2012 00: 00: 00.000
quelle
Wie bereits in @BassamMehanni erwähnt, können Sie ab SQL Server 2008 als DATE umwandeln ...
SELECT * FROM yourTable WHERE dateField >= CAST(GetDate() - 6 AS DATE) AND dateField < CAST(GetDate() + 1 AS DATE)
Die zweite Bedingung kann tatsächlich gerecht sein
GetDate()
, aber ich zeige dieses Format als BeispielLess Than DateX
dafür, dass das dateField nicht auch in ein DATE umgewandelt werden muss, wodurch die Leistung massiv verbessert wird.Wenn Sie 2005 oder jünger sind, können Sie dies verwenden ...
SELECT * FROM yourTable WHERE dateField >= DATEADD(DAY, DATEDIFF(DAY, 0, GetDate()) - 6, 0) AND dateField < DATEADD(DAY, DATEDIFF(DAY, 0, GetDate()) + 1, 0)
quelle
Versuchen Sie es damit.
quelle
Das mag billig aussehen, aber es funktioniert bei mir
quelle
Sie können die Uhrzeit in ein Datum und dann wieder in eine Uhrzeit konvertieren. Dadurch wird der Zeitstempel zurückgesetzt.
quelle
Normalerweise mache ich
SELECT * FROM MyTable WHERE CONVERT(VARCHAR, MyTable.dateField, 101) = CONVERT(VARCHAR, GETDATE(), 101)
Wenn Sie SQL SERVER 2008 verwenden, können Sie dies tun
SELECT * FROM MyTable WHERE CAST(MyTable.dateField AS DATE) = CAST(GETDATE() AS DATE)
Hoffe das hilft
quelle
Sie könnten die Zeit abrunden.
Wenn Sie
ROUND
unten verwenden, wird es auf Mitternacht abgerundet.quelle