Istruzione SQL per selezionare tutte le righe del giorno precedente


120

Sto cercando una buona istruzione SQL per selezionare tutte le righe del giorno precedente da una tabella. La tabella contiene una colonna datetime. Sto usando SQL Server 2005.

Risposte:


212

non avere tempo oggi:

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

ottenere ieri non c'è tempo:

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

query per tutte le righe solo da ieri:

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

@ashuthinks, il tuo commento non ha senso per me. La domanda originale chiede come ottenere le righe dal giorno precedente. Per fare ciò è necessario essere in grado di ottenere solo la data odierna (senza ora) e solo la data di ieri (senza ora). Usi queste date (senza tempo) nella clausola` WHERE`. Tuttavia, SELECT *restituirà tutte le date con i loro orari originali.
KM.

datiff restituisce "Errore di conteggio dei parametri non corretto". e stackoverflow.com/a/18926156/3007408 dice datediff può utilizzare solo 2 parametri. qualche soluzione ??
Sp0T

@ Sp0T, questa domanda è contrassegnata come SQL Server , che ha una funzione DATEDIFF () che accetta tre parametri ( msdn.microsoft.com/en-us/library/ms189794.aspx ) la domanda a cui ti colleghi è per MySql, che immagino funziona in modo diverso come hai trovato. Scoprirai che SQL non è completamente intercambiabile, ci sono molte differenze come questa tra diversi fornitori, specialmente per quanto riguarda la gestione della data.
KM.

Oh grazie. Non lo sapevo. A proposito, ho risolto il problema usando "between curdate () -1 day e curdate ()". Può essere utilizzato anche in questo caso.
Sp0T

1
@RasmusBidstrup, sì. quando corro SELECT getdate(),dateadd(day,datediff(day,1,GETDATE()),0)ottengo:2016-02-01 10:27:54.733 2016-01-31 00:00:00.000
KM.

44

Per ottenere il valore "oggi" in SQL:

convert(date, GETDATE())

Per ottenere "ieri":

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

Per ottenere "oggi meno X giorni": cambia -1 in -X.

Quindi per tutte le righe di ieri, ottieni:

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

Il tipo di dati "date" non esiste in SQL Server 2005. Quando uso invece datetime il valore dell'ora rimane e il calcolo non avviene dalle 0:00 alle 12:00 ma dal momento in cui esegui la query
rudimenter

1
Errore mio. Non ho visto che avevi a che fare con SQL Server 2005. In effetti, il mio codice funziona solo per SQL Server 2008.
Konamiman

Ho sempre pensato che DATEADD (giorno, ....) fosse uno spreco, basta aggiungere o sottrarre il numero di giorni rispetto alla data: SELECT GETDATE () - 1
KM.

18

Sembra che manchi la risposta ovvia. Per ottenere tutti i dati da una tabella (Ttable) in cui la colonna (DatetimeColumn) è un datetime con un timestamp, è possibile utilizzare la seguente query:

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

Questo può essere facilmente modificato in oggi, il mese scorso, l'anno scorso, ecc.


3
Questo funziona abbastanza bene, ma è molto più costoso rispetto a DatetimeColumn BETWEEN DATEADD(day, DATEDIFF(day, 1, GETDATE()) ,0) AND DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)come deve valutare DATEDIFF () su ogni riga
Václav Holuša

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

Questo è il vincitore.
TmsKtel

5

È un filo molto vecchio, ma ecco la mia opinione. Piuttosto che 2 clausole diverse, una maggiore di e una minore di. Uso la seguente sintassi per selezionare i record da una data. Se desideri un intervallo di date, le risposte precedenti sono la strada da percorrere.

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

Nel caso precedente X sarà -1 per i record di ieri


4

Non posso provarlo adesso, ma:

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

3

Questo dovrebbe farlo:

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

1
(Scusa) ma la tua risposta è compatibile solo con MySQL, la domanda è per SQL Server
StefanJCollier

2

In SQL Server fai così:

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

È necessario eseguire il cast di entrambi i lati dell'espressione fino alla data per evitare problemi con la formattazione dell'ora.

Se hai bisogno di controllare l'intervallo in modo più dettagliato, dovresti provare qualcosa di simile:

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

1

Un altro modo per raccontarlo "Ieri" ...

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

Questo presumibilmente non funzionerà bene il 1 ° gennaio, così come il primo giorno di ogni mese. Ma al volo è efficace.


1

Bene, è più facile eseguire il cast della colonna datetime fino ad oggi e che confrontare.

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

0

subdate (now (), 1) restituirà il timestamp di ieri Il codice seguente selezionerà tutte le righe con il timestamp di ieri

Select * FROM `login` WHERE `dattime` <= subdate(now(),1) AND `dattime` > subdate(now(),2)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.