Оператор SQL для выбора всех строк с предыдущего дня


121

Я ищу хороший оператор SQL, чтобы выбрать все строки предыдущего дня из одной таблицы. Таблица содержит один столбец datetime. Я использую SQL Server 2005.

Ответы:


213

получить сегодня некогда:

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

получить вчерашний день нет времени:

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

запрос для всех строк только вчера:

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

@ashuthinks, ваш комментарий для меня не имеет смысла. Исходный вопрос спрашивает, как получить строки за предыдущий день. Для этого вам нужно иметь возможность получать только сегодняшнюю дату (без времени) и только вчерашнюю дату (без времени). Вы используете эти (вневременные) даты в предложении WHERE. Однако SELECT *все даты будут возвращены с исходным временем.
— КМ.

dateiff выдает "Ошибка неправильного подсчета параметров". а stackoverflow.com/a/18926156/3007408 говорит, что dateiff может использовать только 2 параметра. любое решение ??
— Sp0T

@ Sp0T, этот вопрос помечен тегом SQL Server , который имеет функцию DATEDIFF (), которая принимает три параметра ( msdn.microsoft.com/en-us/library/ms189794.aspx ), вопрос, на который вы ссылаетесь, относится к MySql, который, как я полагаю работает иначе, чем вы нашли. Вы обнаружите, что SQL не является полностью взаимозаменяемым, между разными поставщиками существует много подобных различий, особенно в отношении обработки даты.
— КМ.

Ох, спасибо. Не знал этого. Кстати, я решил проблему, используя «между curdate () -1 день и curdate ()». Может быть, его можно использовать и в этом случае.
— Sp0T

1
@RasmusBidstrup, да. при беге SELECT getdate(),dateadd(day,datediff(day,1,GETDATE()),0)получаю:2016-02-01 10:27:54.733 2016-01-31 00:00:00.000
— КМ.

44

Чтобы получить значение «сегодня» в SQL:

convert(date, GETDATE())

Чтобы получить «вчера»:

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

Чтобы получить «сегодня минус X дней»: замените -1 на -X.

Итак, для всех вчерашних строк вы получите:

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

Тип данных "date" не существует в SQL Server 2005. Когда я использую datetime вместо этого, значение времени остается, и расчет происходит не с 0:00 до 12:00, а с момента запуска запроса
— rudimenter

1
Моя ошибка. Я не видел, чтобы вы имели дело с SQL Server 2005. Действительно, мой код работает только с SQL Server 2008.
— Konamiman 01

Я всегда думал, что DATEADD (день, ....) было пустой тратой, просто добавьте или вычтите
— KM.

18

Кажется, очевидного ответа не было. Чтобы получить все данные из таблицы (Ttable), где столбец (DatetimeColumn) представляет собой дату и время с меткой времени, можно использовать следующий запрос:

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

Это можно легко изменить на сегодня, в прошлом месяце, в прошлом году и т. Д.


3
Этот работает довольно хорошо, но намного дороже по сравнению с тем, DatetimeColumn BETWEEN DATEADD(day, DATEDIFF(day, 1, GETDATE()) ,0) AND DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)что он должен оценивать DATEDIFF () в каждой строке
— Вацлав Холуша


5

Это действительно старая тема, но вот мое мнение о ней. Вместо двух разных предложений, одно больше и меньше. Я использую этот синтаксис ниже для выбора записей из даты A. Если вам нужен диапазон дат, вам подойдут предыдущие ответы.

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

В приведенном выше случае X будет -1 для вчерашних записей.


4

Не могу сейчас протестировать, но:

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

3

Это должно сделать это:

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

1
(Извините), но ваш ответ совместим только с MySQL, вопрос касается SQL Server
— StefanJCollier

2

В SQL Server сделайте так:

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

Вы должны привести обе стороны выражения к дате, чтобы избежать проблем с форматированием времени.

Если вам нужно более подробно контролировать интервал, попробуйте что-то вроде:

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

1

Другой способ сказать это «вчера» ...

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

Вероятно, это не сработает 1 января, а также в первый день каждого месяца. Но на лету это эффективно.


1

Что ж, проще привести столбец datetime к дате и чем сравнивать.

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

0

subdate (now (), 1) вернет метку времени вчерашнего дня. Приведенный ниже код выберет все строки со вчерашней меткой времени.

Select * FROM `login` WHERE `dattime` <= subdate(now(),1) AND `dattime` > subdate(now(),2)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.