Оператор 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.