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.

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)

@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())

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.


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


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


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)

3

Isso deve servir:

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

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)

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.


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)) 

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)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.