Mam mały problem z zapytaniem SQL. Używam funkcji GETDATE, ale powiedzmy, że wykonuję skrypt o 17:00, a rekordy pojawią się między 17.12.2011 a 17.12.2011 17:00. Jak mogę to zrobić, aby wyciągać rekordy z całego 12/12/2011 - 12/18/2011 w zasadzie ignorować czas.
Mój skrypt:
WHERE Orders.OrderStatus = 'Shipped'
AND Orders.ShipDate > (GETDATE()-6)
sql
sql-server
sql-server-2005
getdate
henryaaron
źródło
źródło
Oto najprostsza rzecz, jaką znalazłem
-- Midnight floor of current date SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE()))
DATEDIFF zwraca całkowitą liczbę dni przed lub od 1900-1-1, a funkcja Convert Datetime obligatoryjnie przywraca tę datę o północy.
Ponieważ DateDiff zwraca liczbę całkowitą, możesz użyć dodawania lub odejmowania dni, aby uzyskać właściwe przesunięcie.
SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE()) + @dayOffset)
To nie jest zaokrąglanie, to ucinanie ... Ale myślę, że o to się prosi. (Aby zaokrąglić, dodać jeden i obciąć ... i to też nie jest zaokrąglanie, to sufit, ale najprawdopodobniej to, co chcesz. Aby naprawdę zaokrąglić, dodaj 0,5 (czy to działa?) I obetnij.
Okazuje się, że możesz dodać .5 do GetDate () i działa zgodnie z oczekiwaniami.
-- Round Current time to midnight today or midnight tomorrow SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE() + .5))
Wykonałem wszystkie testy na SQL Server 2008, ale myślę, że te funkcje mają zastosowanie również w 2005 roku.
źródło
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
źródło
SELECT getdate()
Wynik: 2012-12-14 16: 03: 33,360
SELECT convert(datetime,convert(bigint, getdate()))
Wynik 2012-12-15 00: 00: 00.000
źródło
Jak wspomniał @BassamMehanni, w SQL Server 2008 można rzutować jako DATE ...
SELECT * FROM yourTable WHERE dateField >= CAST(GetDate() - 6 AS DATE) AND dateField < CAST(GetDate() + 1 AS DATE)
Drugi warunek może być w rzeczywistości sprawiedliwy
GetDate()
, ale pokazuję ten format jako przykład,Less Than DateX
aby uniknąć konieczności rzutowania dateField również na DATĘ, co znacznie poprawia wydajność.Jeśli masz rok 2005 lub mniej, możesz użyć tego ...
SELECT * FROM yourTable WHERE dateField >= DATEADD(DAY, DATEDIFF(DAY, 0, GetDate()) - 6, 0) AND dateField < DATEADD(DAY, DATEDIFF(DAY, 0, GetDate()) + 1, 0)
źródło
Spróbuj tego użyć.
źródło
To może wyglądać na tanie, ale działa na mnie
źródło
Możesz przekonwertować datę i godzinę na datę, a następnie z powrotem na datę i godzinę. Spowoduje to zresetowanie sygnatury czasowej.
źródło
Zwyklę robię
SELECT * FROM MyTable WHERE CONVERT(VARCHAR, MyTable.dateField, 101) = CONVERT(VARCHAR, GETDATE(), 101)
jeśli używasz programu SQL SERVER 2008, możesz to zrobić
SELECT * FROM MyTable WHERE CAST(MyTable.dateField AS DATE) = CAST(GETDATE() AS DATE)
Mam nadzieję że to pomoże
źródło
Mógłbyś zaokrąglić czas.
Użycie
ROUND
poniżej zaokrągli go do północy.źródło