SQL-запрос для предоставления данных со вчерашнего дня с 12:00 до 23:59 включительно - PullRequest
0 голосов
/ 21 мая 2018

У меня есть запрос со следующим условием для предоставления данных со вчерашнего дня, включая время с 12:00 до 23:59.

Select * from table where passDate >= DATEADD(DAY, -1, convert(date, GETDATE()))
and passDate < convert(date, GETDATE())

passDate - это столбец dateTime.

Даст ли вышеуказанный результат требуемый результат?Есть ли какой-нибудь лучший способ сделать это отдельно от вышеописанного?

Ответы [ 4 ]

0 голосов
/ 21 мая 2018

Удивило, что этот метод на Бренте Озаре использует индекс, нарушая правила проходимости, как я их понял:

https://www.brentozar.com/archive/2016/12/date-math-clause/

Этот метод должен давать наилучшие результаты, если индексиспользуется:

Select * 
from table 
where convert(date, [passDate]) = dateadd(d,-1, convert(date, getdate()))
0 голосов
/ 21 мая 2018
DECLARE @MidNightToday datetime;
DECLARE @MidNightYesterday datetime;

SET @MidNightToday = Convert(DateTime, DATEDIFF(DAY, 0, GETDATE()));
SET @MidNightYesterday = Convert(DateTime, DATEDIFF(DAY, 1, GETDATE()));

Select * from table where passDate between @MidNightYesterday and 
@MidNightToday;
0 голосов
/ 21 мая 2018

Это даст вам желаемый результат:

declare @start datetime = cast(cast(dateadd(day, -1, getdate()) as date) as datetime)
declare @end datetime = dateadd(hour, 12, @start)
--to see, that these are correct boundaries
--select @start, @end
-- today it would return 
-- 2018-05-20 00:00:00.000 | 2018-05-20 12:00:00.000

select * from TBL
where passDate between @start and @end
0 голосов
/ 21 мая 2018

Если вы не можете удалить GETDATE () из предложения WHERE, это, вероятно, более простое для чтения решение.

Select 
* 
from 
table 
where 
DATEDIFF(DD,passdate,GETDATE()) = 1

Но это не самое эффективное решение.

Идеально предварительно загружать GETDATE () в переменную

DECLARE @d DATE = GETDATE();

Select 
* 
from 
table 
where 
DATEDIFF(DD,passdate,@d) = 1

Если в [passdate] есть индекс, то в идеале вам следует избегать функций в предложении WHERE, поскольку это влияет на возможности SQL Server.использовать индексы.

Вот что-то более дружественное к индексам (но для вашей среды потребуется настройка), но для правильной работы переменные должны иметь тип данных dame как столбец [passdate], чтобы избежать неявных преобразований.

DECLARE @start DATE = DATEADD(DD,-1,GETDATE());
DECLARE @end DATE = GETDATE();

Select 
* 
from 
table 
where 
passdate >= @start
AND
passdate < @end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...