Оператор SQL для вибору всіх рядків попереднього дня


120

Я шукаю хорошу заяву SQL для вибору всіх рядків попереднього дня з однієї таблиці. Таблиця містить один стовпчик дати. Я використовую SQL Server 2005.

Відповіді:


212

отримати сьогодні немає часу:

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 говорить DateDiff може використовувати тільки два параметри. будь-яке рішення ??
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 ранку до 12 вечора, а з моменту запуску Запиту
рудиметр

1
Моя помилка. Я не бачив, щоб ви мали справу з SQL Server 2005. Дійсно, мій код працює лише для SQL Server 2008.
Конаміман

Я завжди думав, що DATEADD (день, ....) - марно, просто додайте або відніміть кількість днів від дати: ВИБІРАТИ GETDATE () - 1
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

Це дійсно стара нитка, але ось я взяла на себе її. Замість 2 різних застережень, один більший та менший. Я використовую цей синтаксис нижче для вибору записів із дати. Якщо ви хочете діапазон дат, то попередні відповіді - це шлях.

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

Що ж, простіше віддати стовпчик дати на дату і порівняти.

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

0

subdate (зараз (), 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.