Instrucțiune SQL pentru a selecta toate rândurile din ziua precedentă (Programare, Sql, Server Sql, Sql Server 2005)

Caut o declarație SQL bună pentru a selecta toate rândurile din ziua precedentă dintr-un tabel. Tabelul conține o coloană de datare. Folosesc SQL Server 2005.

11 răspunsuri

obțineți astăzi fără timp:

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

get yestersday no time:

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

interogare pentru toate rândurile din ziua de ieri:

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

Comentarii

  • @ashuthinks, comentariul tău nu are sens pentru mine. Întrebarea inițială întreabă cum să obțineți rânduri din ziua precedentă. Pentru a face acest lucru, trebuie să puteți obține doar data de astăzi (fără oră) și doar data de ieri (fără oră). Folosiți aceste date (atemporale) în clauza` WHERE`. Cu toate acestea, clauza SELECT * va returna orice date cu orele lor originale. –  > Por KM..
  • datediff dă „Incorrect Parameter Count error”. și stackoverflow.com/a/18926156/3007408 spune că datediff poate folosi doar 2 parametri. vreo soluție? –  > Por Sp0T.
  • @Sp0T, această întrebare este etichetată cu SQL Server, care are o funcție DATEDIFF() care acceptă trei parametri (msdn.microsoft.com/en-us/library/ms189794.aspx) întrebarea la care faci legătura este pentru MySql, care cred că funcționează diferit, după cum ai constatat. Veți constata că SQL nu este complet interschimbabil, există multe diferențe de acest gen între diferiți furnizori, în special în ceea ce privește manipularea datelor. –  > Por KM..
  • Ohh, mulțumesc. Nu știam asta. Btw Am rezolvat problema folosind „between curdate() -1 day and curdate()”. Poate că poate fi folosit și în acest caz. –  > Por Sp0T.
  • @RasmusBidstrup, da, când execut SELECT getdate(),dateadd(day,datediff(day,1,GETDATE()),0) obțin: 2016-02-01 10:27:54.733 2016-01-31 00:00:00.000 –  > Por KM..

Pentru a obține valoarea „today” în SQL:

convert(date, GETDATE())

Pentru a obține „ieri”:

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

Pentru a obține „astăzi minus X zile”: schimbați -1 în -X.

Astfel, pentru toate rândurile de ieri, veți obține:

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

Comentarii

  • Tipul de date „date” nu există în SQL Server 2005. Când folosesc datatime în loc de data, valoarea timpului rămâne și calculul nu se face de la 0am la 12pm, ci de la ora la care se execută interogarea –  > Por rudimenter.
  • Greșeala mea. Nu am văzut că aveți de-a face cu SQL Server 2005. Într-adevăr, codul meu funcționează doar pentru SQL Server 2008. –  > Por Konamiman.
  • Întotdeauna am crezut că DATEADD(day,….) era o risipă, doar adăugați sau scădeți numărul de zile față de dată: SELECT GETDATE()-1 –  > Por KM..

Se pare că lipsea răspunsul evident. Pentru a obține toate datele dintr-o tabelă (Ttable) în care coloana (DatetimeColumn) este o dată cu un timestamp, se poate utiliza următoarea interogare:

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

Acest lucru poate fi ușor de schimbat în astăzi, luna trecută, anul trecut, etc.

Comentarii

  • Aceasta funcționează destul de bine, dar este mult mai costisitoare în comparație cu DatetimeColumn BETWEEN DATEADD(day, DATEDIFF(day, 1, GETDATE()) ,0) AND DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0) deoarece trebuie să evalueze DATEDIFF() pe fiecare rând –  > Por Václav Holuša.
SELECT * from table_name where date_field = DATE_SUB(CURRENT_DATE(),INTERVAL 1 DAY);

Comentarii

  • Acesta este câștigătorul. –  > Por TmsKtel.

Este un subiect foarte vechi, dar iată ce părere am eu despre el.Mai degrabă decât 2 clauze diferite, una mai mare decât și una mai mică decât. Folosesc această sintaxă de mai jos pentru a selecta înregistrările din data A. Dacă doriți un interval de date, atunci răspunsurile anterioare sunt calea de urmat.

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

În cazul de mai sus, X va fi -1 pentru înregistrările de ieri.

Nu pot testa acum, dar:

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

Acest lucru ar trebui să meargă:

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

Comentarii

  • (Îmi pare rău), dar răspunsul dvs. este compatibil doar cu MySQL, întrebarea este pentru SQL Server –  > Por Stefan Collier.

În SQL Server faceți așa:

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

Ar trebui să transformați ambele părți ale expresiei în date pentru a evita problemele legate de formatarea timpului.

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

Un alt mod de a-i spune „Ieri”…

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

Este posibil ca acest lucru să nu funcționeze bine la 1 ianuarie, precum și în prima zi a fiecărei luni. Dar în zbor este eficient.

Ei bine, este mai ușor să transformați coloana datetime în date și apoi să comparați.

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

subdate(now(),1) va returna data și ora de ieriCodul de mai jos va selecta toate rândurile cu data și ora de ieri

Select * FROM `login` WHERE `dattime` <= subdate(now(),1) AND `dattime` > subdate(now(),2)