Instrução SQL para selecionar todas as linhas do dia anterior

120

Estou procurando uma boa instrução SQL para selecionar todas as linhas do dia anterior de uma tabela. A tabela contém uma coluna datetime. Estou usando o SQL Server 2005.

rudimentador
fonte

Respostas:

212

comece hoje sem tempo:

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

comece ontem sem tempo:

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

consulta para todas as linhas de ontem:

select 
    * 
    from yourTable
    WHERE YourDate >= dateadd(day,datediff(day,1,GETDATE()),0)
        AND YourDate < dateadd(day,datediff(day,0,GETDATE()),0)
KM.
fonte
@ashuthinks, seu comentário não faz sentido para mim. A pergunta original pergunta como obter linhas do dia anterior. Para fazer isso, você precisa ser capaz de obter apenas a data de hoje (sem hora) e apenas a data de ontem (sem hora). Você usa essas datas (atemporais) na cláusula `WHERE`. No entanto, o SELECT *retornará todas as datas com os horários originais.
KM.
datediff fornece "Erro de contagem de parâmetro incorreto". e stackoverflow.com/a/18926156/3007408 diz que datediff pode usar apenas 2 parâmetros. qualquer solução??
Sp0T
@ Sp0T, esta pergunta está marcada como SQL Server , que tem uma função DATEDIFF () que aceita três parâmetros ( msdn.microsoft.com/en-us/library/ms189794.aspx ), a pergunta que você vincula é para MySql, que eu acho funciona de forma diferente como você encontrou. Você descobrirá que SQL não é completamente intercambiável, existem muitas diferenças como essa entre diferentes fornecedores, especialmente em relação ao tratamento de datas.
KM.
Ohh, obrigado. Não sabia disso. Btw eu resolvi o problema usando "entre curdate () -1 dia e curdate ()". Pode ser que também possa ser usado neste caso.
Sp0T
1
@RasmusBidstrup, sim. quando corro SELECT getdate(),dateadd(day,datediff(day,1,GETDATE()),0), obtenho:2016-02-01 10:27:54.733 2016-01-31 00:00:00.000
KM.
44

Para obter o valor "today" no SQL:

convert(date, GETDATE())

Para obter "ontem":

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

Para obter "hoje menos X dias": mude -1 para -X.

Portanto, para todas as linhas de ontem, você obtém:

select * from tablename
   where date >= DATEADD(day, -1, convert(date, GETDATE()))
   and date < convert(date, GETDATE())
Konamiman
fonte
O tipo de dados "data" não existe no SQL Server 2005. Quando eu uso datetime, o valor da hora permanece e o cálculo acontece não das 0h às 12h, mas a partir do momento em que você executa o Query
rudimenter
1
Meu erro. Não vi que você estava lidando com o SQL Server 2005. Na verdade, meu código funciona apenas para o SQL Server 2008.
Konamiman,
Sempre achei DATEADD (day, ....) um desperdício, basta somar ou subtrair o número de dias da data: SELECT GETDATE () - 1
KM.
18

Parece que a resposta óbvia estava faltando. Para obter todos os dados de uma tabela (Ttable) onde a coluna (DatetimeColumn) é um datetime com um timestamp, a seguinte consulta pode ser usada:

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

Isso pode ser facilmente alterado para hoje, mês passado, ano passado, etc.

me chame de Steve
fonte
3
Este funciona muito bem, mas é muito mais caro em comparação com DatetimeColumn BETWEEN DATEADD(day, DATEDIFF(day, 1, GETDATE()) ,0) AND DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)o valor de DATEDIFF () em cada linha
Václav Holuša
10
SELECT * from table_name where date_field = DATE_SUB(CURRENT_DATE(),INTERVAL 1 DAY);
Romancha KC
fonte
Este é o vencedor.
TmsKtel
5

É um tópico muito antigo, mas aqui está minha opinião sobre ele. Em vez de 2 cláusulas diferentes, uma maior que e menor que. Eu uso a sintaxe abaixo para selecionar registros de uma data. Se você quiser um intervalo de datas, as respostas anteriores são o caminho a percorrer.

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

No caso acima, X será -1 para os registros de ontem

Rahul
fonte
4

Não posso testar agora, mas:

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

Isso deve servir:

WHERE `date` = CURDATE() - INTERVAL 1 DAY
candelabro
fonte
1
(Desculpe) mas sua resposta é apenas compatível com MySQL, a pergunta é para SQL Server
StefanJCollier
2

No SQL Server, faça assim:

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

Você deve converter ambos os lados da expressão para a data para evitar problemas com a formatação de hora.

Se você precisa controlar o intervalo com mais detalhes, você deve tentar algo como:

declare @start datetime = cast(getdate() - 1 as date)
declare @end datetime = cast(getdate() - 1 as date)
set @end = dateadd(second, 86399, @end)
Mário Meyrelles
fonte
1

Outra forma de dizer "Ontem" ...

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

Isso provavelmente não funcionará bem em 1º de janeiro, bem como no primeiro dia de cada mês. Mas na hora é eficaz.

user3428292
fonte
1

Bem, é mais fácil lançar a coluna datetime para a data e do que comparar.

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

subdate (now (), 1) irá retornar a data e hora de ontem O código abaixo irá selecionar todas as linhas com a data e hora de ontem

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