Instrukcja SQL, aby zaznaczyć wszystkie wiersze z poprzedniego dnia


120

Szukam dobrej instrukcji SQL, aby wybrać wszystkie wiersze z poprzedniego dnia z jednej tabeli. Tabela zawiera jedną kolumnę z datą i godziną. Używam SQL Server 2005.

Odpowiedzi:


212

dziś nie ma czasu:

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

pobierz wczoraj bez czasu:

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

zapytanie dla wszystkich wierszy tylko z wczoraj:

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

@ashuthinks, Twój komentarz nie ma dla mnie sensu. Oryginalne pytanie dotyczy sposobu pobierania wierszy z poprzedniego dnia. Aby to zrobić, musisz mieć możliwość uzyskania tylko dzisiejszej daty (bez godziny) i tylko wczorajszej daty (bez godziny). Używasz tych (ponadczasowych) dat w klauzuli "WHERE". Jednak SELECT *zwróci wszelkie daty z ich oryginalnymi godzinami.
KM.

datediff wyświetla „Błąd niepoprawnej liczby parametrów”. a stackoverflow.com/a/18926156/3007408 mówi, że datediff może używać tylko 2 parametrów. jakieś rozwiązanie?
Sp0T

@ Sp0T, to pytanie jest otagowane jako SQL Server , który ma funkcję DATEDIFF (), która akceptuje trzy parametry ( msdn.microsoft.com/en-us/library/ms189794.aspx ) pytanie, do którego tworzysz link, dotyczy MySql, co jak sądzę działa inaczej niż znalazłeś. Przekonasz się, że SQL nie jest całkowicie wymienny, istnieje wiele podobnych różnic między różnymi dostawcami, szczególnie w zakresie obsługi dat.
KM.

Och, dzięki. Nie wiedziałem tego. Btw rozwiązałem problem, używając "between curdate () -1 day i curdate ()". Być może można go użyć również w tym przypadku.
Sp0T

1
@RasmusBidstrup, tak. kiedy biegnę SELECT getdate(),dateadd(day,datediff(day,1,GETDATE()),0)otrzymuję:2016-02-01 10:27:54.733 2016-01-31 00:00:00.000
KM.

44

Aby uzyskać wartość „dzisiaj” w języku SQL:

convert(date, GETDATE())

Aby otrzymać „wczoraj”:

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

Aby otrzymać „dzisiaj minus X dni”: zmień -1 na -X.

Więc dla wszystkich wczorajszych wierszy otrzymujesz:

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

Typ danych „data” nie istnieje w SQL Server 2005. Gdy zamiast tego używam daty i godziny, wartość czasu pozostaje, a obliczenia są wykonywane nie od 0:00 do 12:00, ale od czasu uruchomienia zapytania
rudimenter

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

Zawsze myślałem, że DATEADD (dzień, ....) to strata, po prostu dodaj lub odejmij liczbę dni w stosunku do daty: SELECT GETDATE () - 1
KM.

18

Wygląda na to, że brakowało oczywistej odpowiedzi. Aby uzyskać wszystkie dane z tabeli (Ttable), w której kolumna (DatetimeColumn) jest datą i godziną z sygnaturą czasową, można użyć następującego zapytania:

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

Można to łatwo zmienić na dziś, w zeszłym miesiącu, w zeszłym roku itp.


3
Ten działa całkiem nieźle, ale jest znacznie droższy w porównaniu do, DatetimeColumn BETWEEN DATEADD(day, DATEDIFF(day, 1, GETDATE()) ,0) AND DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)ponieważ musi oceniać DATEDIFF () w każdym wierszu
Václav Holuša


5

To naprawdę stary wątek, ale oto moje podejście. Zamiast 2 różnych klauzul, jedną większą niż i mniejszą niż. Używam poniższej składni do wybierania rekordów z daty. Jeśli chcesz określić zakres dat, najlepsze są poprzednie odpowiedzi.

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

W powyższym przypadku X wyniesie -1 dla wczorajszych rekordów


4

Nie mogę tego teraz przetestować, ale:

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

3

To powinno wystarczyć:

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

1
(Przepraszam), ale Twoja odpowiedź jest zgodna tylko z MySQL, pytanie dotyczy SQL Server
StefanJCollier

2

W SQL Server wykonaj następujące czynności:

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

Należy rzutować obie strony wyrażenia do tej pory, aby uniknąć problemów z formatowaniem czasu.

Jeśli potrzebujesz bardziej szczegółowo kontrolować interwał, powinieneś 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)

1

Innym sposobem na powiedzenie „wczoraj” ...

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

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


1

Cóż, łatwiej jest rzutować kolumnę z datą i godziną do tej pory, a niż porównywać.

SELECT * FROM TABLE_NAME WHERE cast(COLUMN_NAME as date) = 
   dateadd(day,0, convert(date, getdate(), 105)) 

0

subdate (now (), 1) zwróci wczorajszy znacznik czasu Poniższy kod wybierze wszystkie wiersze z wczorajszym znacznikiem czasu

Select * FROM `login` WHERE `dattime` <= subdate(now(),1) AND `dattime` > subdate(now(),2)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.