2009-10-01 9 views

Odpowiedz

148

dostać dzisiaj Nie czas:

SELECT dateadd(day,datediff(day,0,GETDATE()),0) 

się yestersday czasu:

SELECT dateadd(day,datediff(day,1,GETDATE()),0) 

kwerendy dla wszystkich wierszy z tylko wczoraj:

select 
    * 
    from yourTable 
    WHERE YourDate >= dateadd(day,datediff(day,1,GETDATE()),0) 
     AND YourDate < dateadd(day,datediff(day,0,GETDATE()),0) 
+0

JEŚLI POTRZEBUJĘ TAKŻE TAKŻE? – Neo

+0

@ashuthinks, twój komentarz nie ma dla mnie sensu. Oryginalne pytanie z pytaniem, jak zdobyć wiersze z poprzedniego dnia. Aby to zrobić, musisz być w stanie uzyskać tylko dzisiejszą datę (brak czasu) i wczorajszą datę (brak czasu). Używasz tych (ponadczasowych) dat w klauzuli "WHERE". Jednak 'SELECT *' zwróci wszystkie daty z ich oryginalnymi czasami. –

+0

datediff podaje "Błędny błąd licznika parametrów". i http://stackoverflow.com/a/18926156/3007408 mówi, że datediff może używać tylko 2 parametrów. jakiekolwiek rozwiązanie? – Sp0T

4

nie można przetestować go teraz, ale:

select * from tablename where date >= dateadd(day, datediff(day, 1, getdate()), 0) and date < dateadd(day, datediff(day, 0, getdate()), 0) 
26

Aby uzyskać "Dzisiaj" wartość w SQL:

convert(date, GETDATE()) 

aby "wczoraj" :

DATEADD(day, -1, convert(date, GETDATE())) 

Aby uzyskać "dzisiaj minus X dni": zmień -1 na -X.

Więc dla wszystkich wczorajszych rzędach, masz:

select * from tablename 
    where date >= DATEADD(day, -1, convert(date, GETDATE())) 
    and date < convert(date, GETDATE()) 
+0

„data” dataType robi istnieje w SQL Server 2005. Gdy używam DateTime zamiast pobyty wartości czasu i obliczanie dzieje się nie od 0 do 12, ale od czasu uruchomienia zapytania – rudimenter

+1

Mój błąd. Nie widziałem, że masz do czynienia z SQL Server 2005. Rzeczywiście, mój kod działa tylko dla SQL Server 2008. – Konamiman

+0

Zawsze uważałem, że DATEADD (dzień, ....) było marnotrawstwem, po prostu dodaj lub odejmij liczbę dni w stosunku do daty: _WYBIERZ GETDATE() - 1_ –

5

Jest to naprawdę stara nitka, ale tutaj jest moja opinia. Zamiast 2 różnych klauzul, jeden większy niż i mniejszy niż. Używam poniższej składni do wybierania rekordów z daty. Jeśli chcesz zakres dat, to wcześniejsze odpowiedzi są drogą do zrobienia.

SELECT * FROM TABLE_NAME WHERE 
DATEDIFF(DAY, DATEADD(DAY, X , CURRENT_TIMESTAMP), <column_name>) = 0 

w powyższym przypadku X będzie -1 do wczorajszych rekordów

7
SELECT * from table_name where date_field = DATE_SUB(CURRENT_DATE(),INTERVAL 1 DAY); 
1

Innym sposobem, aby poinformować go "Yesterday" ...

Select * from TABLE 
where Day(DateField) = (Day(GetDate())-1) 
and Month(DateField) = (Month(GetDate())) 
and Year(DateField) = (Year(getdate())) 

To niewykluczone nie zadziała dobrze 1 stycznia, a także pierwszego dnia każdego miesiąca. Ale w locie to jest skuteczne.

12

Wygląda na to, że brakuje oczywistej odpowiedzi. Aby uzyskać wszystkie dane z tabeli (TTable), gdzie kolumna (DatetimeColumn) jest datetime ze znacznikiem czasu następujące zapytanie można stosować:

SELECT * FROM Ttable 
WHERE DATEDIFF(day,Ttable.DatetimeColumn ,GETDATE()) = 1 -- yesterday 

ten może być łatwo zmieniona na dzisiaj, ostatniego miesiąca, w ubiegłym roku, itp

1

należy to zrobić:

WHERE `date` = CURDATE() - INTERVAL 1 DAY 
1

W SQL Server zrobić tak:

where cast(columnName as date) = cast(getdate() -1 as date) 

Do tej pory należy oblewać obie strony wyrażenia, aby uniknąć problemów z formatowaniem czasu.

Jeśli trzeba kontrolować odstęp bardziej szczegółowo, to należy spróbować czegoś takiego:

declare @start datetime = cast(getdate() - 1 as date) 
declare @end datetime = cast(getdate() - 1 as date) 
set @end = dateadd(second, 86399, @end) 
Powiązane problemy