powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как лучше фильтровать по дате?
20 сообщений из 20, страница 1 из 1
Как лучше фильтровать по дате?
    #39944571
listtoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот например здесь чз BETWEEN можно?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE PROCEDURE [dbo].[lapsGetRequestPasswordLog]
(
    @startDate  DATE = NULL,
    @endDate    DATE = NULL
)
AS
BEGIN
	SET NOCOUNT ON;
    
	SELECT [Id]
      ,[Pass]
      ,[Mess]
      ,[Comp]
      ,[Status]
      ,[Rule]
      ,[Login]
      ,[ValidDate]
      ,[Created]      
  FROM [RequestPasswordLog] AS rpl
  WHERE (CAST(rpl.Created AS DATE) >= @startDate OR @startDate IS NULL)
        AND (CAST(rpl.Created AS DATE) <= @endDate OR @endDate IS NULL)

END
...
Рейтинг: 0 / 0
Как лучше фильтровать по дате?
    #39944576
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не надо делать cast для полей. cast надо делать для переменных. Тогда есть какие-то шансы у индексов.
...
Рейтинг: 0 / 0
Как лучше фильтровать по дате?
    #39944577
listtoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич
Не надо делать cast для полей. cast надо делать для переменных. Тогда есть какие-то шансы у индексов.

ok
...
Рейтинг: 0 / 0
Как лучше фильтровать по дате?
    #39944578
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно.
Только вот так
Код: sql
1.
2.
  WHERE CAST(rpl.Created AS DATE) >= isnull(@startDate, '17530101')
        AND CAST(rpl.Created AS DATE) <= isnull(@endDate, '99991231')

Тогда Index Seek будет работать.
...
Рейтинг: 0 / 0
Как лучше фильтровать по дате?
    #39964175
listtoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
Можно.
Только вот так
Код: sql
1.
2.
  WHERE CAST(rpl.Created AS DATE) >= isnull(@startDate, '17530101')
        AND CAST(rpl.Created AS DATE) <= isnull(@endDate, '99991231')

Тогда Index Seek будет работать.

поясните плиз когда CAST для полей можно писать а когда нет?
...
Рейтинг: 0 / 0
Как лучше фильтровать по дате?
    #39964185
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
listtoview
invm
Можно.
Только вот так
Код: sql
1.
2.
  WHERE CAST(rpl.Created AS DATE) >= isnull(@startDate, '17530101')
        AND CAST(rpl.Created AS DATE) <= isnull(@endDate, '99991231')


Тогда Index Seek будет работать.

поясните плиз когда CAST для полей можно писать а когда нет?
Даже не знаю, какой смысл об этом задумываться, если для условийя
Код: sql
1.
2.
WHERE rpl.Created >= isnull(@startDate, '17530101')
        AND rpl.Created <= isnull(@endDate, '99991231')

индекс точно будет работать, а семантически она эквивалентна предыдущей.
...
Рейтинг: 0 / 0
Как лучше фильтровать по дате?
    #39964188
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как лучше фильтровать по дате?
    #39964196
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
listtoview
пропущено...

поясните плиз когда CAST для полей можно писать а когда нет?
Даже не знаю, какой смысл об этом задумываться, если для условийя
Код: sql
1.
2.
WHERE rpl.Created >= isnull(@startDate, '17530101')
        AND rpl.Created <= isnull(@endDate, '99991231')


индекс точно будет работать, а семантически она эквивалентна предыдущей.

Нет, в первом случае отбрасывается время.
...
Рейтинг: 0 / 0
Как лучше фильтровать по дате?
    #39964219
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex
alexeyvg
пропущено...
Даже не знаю, какой смысл об этом задумываться, если для условийя
Код: sql
1.
2.
WHERE rpl.Created >= isnull(@startDate, '17530101')
        AND rpl.Created <= isnull(@endDate, '99991231')



индекс точно будет работать, а семантически она эквивалентна предыдущей.

Нет, в первом случае отбрасывается время.
А, ну да, для второго условия.

Ну, всё равно не вижу смысла думать о тонкостях использования индекса, вместо того, что бы добавить сутки к @endDate, и заменить <= на <

Это же даже естественней выглядит.
...
Рейтинг: 0 / 0
Как лучше фильтровать по дате?
    #39964272
Fox Malder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg,

1) Хорошая практика это - не проводить операции над полями в инструкции where.

2) Использование between строит такой же план выполнения как и обычное сравнение.
И с точки зрения оптимизации вы ничего не выигрываете.
Но с точки зрения читаемости запросов это лучше и понятне.
И также считается хорошей практикой.

Код: sql
1.
2.
3.
where rpl.Created between
	isnull( @startDate, '17530101' ) AND
	isnull( dateadd(dd,1,@endDate), '99991231' )
...
Рейтинг: 0 / 0
Как лучше фильтровать по дате?
    #39964292
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fox Malder Использование between строит такой же план выполнения как и обычное сравнение.
И с точки зрения оптимизации вы ничего не выигрываете.
Но с точки зрения читаемости запросов это лучше и понятне.
Здесь согласен
Fox Malder И также считается хорошей практикой.а вот здесь не соглашусь.

YouTube Video
...
Рейтинг: 0 / 0
Как лучше фильтровать по дате?
    #39964306
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fox Malder
2) Использование between строит такой же план выполнения как и обычное сравнение.
И с точки зрения оптимизации вы ничего не выигрываете.
Но с точки зрения читаемости запросов это лучше и понятне.
И также считается хорошей практикой.

Код: sql
1.
2.
3.
where rpl.Created between
	isnull( @startDate, '17530101' ) AND
	isnull( dateadd(dd,1,@endDate), '99991231' )

Дык результат же будет другой.

С between нельзя отфильтровать записи за день, есмли не делать CAST поля в дату.

Т.е. эти условия будут эквивалентны:
Код: sql
1.
2.
WHERE CAST(rpl.Created AS DATE) between @startDate and @endDate
WHERE rpl.Created >= @startDate and rpl.Created < dateadd(dd,1,@endDate)

но не
Код: sql
1.
WHERE rpl.Created between @startDate and dateadd(dd,1,@endDate)
...
Рейтинг: 0 / 0
Как лучше фильтровать по дате?
    #39964317
Fox Malder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg,

согласен, писал ночью
...
Рейтинг: 0 / 0
Как лучше фильтровать по дате?
    #39964320
Fox Malder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SERG1257,

Видео хорошее!
Но оно больше о том, что нужно понимать, какими мы типами данных оперируем. И можем ли мы точно определить концы отрезка в оперируемом домене (типе данных).

Если меня интересуют все даnы с 5 по 7 в домене date, то у меня уже не будет ни милисекунд, ни насекунд, ни типа datetime2 с повышенной тоностью. В том числе и даты, например, с 20 февраля по конец февраля, где я легко могу получить значение конца месяца в домене date, но что усложнит задачу, при решении ее в домене datetime2, и тогда мы открываем это видио и смотрим подводные камни.

В коде, который я привел, я попался в эту ловушку:

авторwhere rpl.Created between
isnull( @startDate, '17530101' ) AND
isnull( dateadd(dd,1,@endDate), '99991231' )
...
Рейтинг: 0 / 0
Как лучше фильтровать по дате?
    #39964323
Fox Malder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SERG1257,

Но between хорошо тем, когда мы точно можем определить концы отрезка.
И нам не нужно делать >= для начала и строго меньше < для конца промежутка.
Т.е. это наглядный эквивалент >= начало и <= конец.
В остальных случаях, как в видео, конечно же мы используем операторы сравнения.

Даже оператор isnull заменяет более длинную и не всегда удобную проверку на null.
...
Рейтинг: 0 / 0
Как лучше фильтровать по дате?
    #39964364
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
listtoview
когда CAST для полей можно писать а когда нет?

В правильно спроектированной базе и правильно написанном приложении CAST не используется никогда.
...
Рейтинг: 0 / 0
Как лучше фильтровать по дате?
    #39964365
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
listtoview
когда CAST для полей можно писать а когда нет?

В правильно спроектированной базе и правильно написанном приложении CAST не используется никогда.
Как раз наоборот. Все литералы желательно кастовать к типу поля явно. Особенно числовые.
...
Рейтинг: 0 / 0
Как лучше фильтровать по дате?
    #39964458
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич
Все литералы желательно кастовать к типу поля явно. Особенно числовые.

Вы всерьёз предлагаете писать "CAST(12345 as integer)"?

Я понимаю, что в MS SQL нет литералов datetime, но это ещё один повод использовать в запросах параметры и типизованные переменные.
...
Рейтинг: 0 / 0
Как лучше фильтровать по дате?
    #39964466
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Вы всерьёз предлагаете писать "CAST(12345 as integer)"?
Буквально вот так - не стоит, а например
Код: sql
1.
where t.IsActive = cast(1 as bit)

- стоит.
...
Рейтинг: 0 / 0
Как лучше фильтровать по дате?
    #39964484
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Гавриленко Сергей Алексеевич
Все литералы желательно кастовать к типу поля явно. Особенно числовые.

Вы всерьёз предлагаете писать "CAST(12345 as integer)"?

Я понимаю, что в MS SQL нет литералов datetime, но это ещё один повод использовать в запросах параметры и типизованные переменные.
int в int не надо, а во все, что меньше (bit, tinyint, smallint) точно надо.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как лучше фильтровать по дате?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]