powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Условие сравнения по дате с возможными NULL-значениями
25 сообщений из 26, страница 1 из 2
Условие сравнения по дате с возможными NULL-значениями
    #39885651
shanton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Упрощённый вариант процедуры:
Код: sql
1.
2.
3.
4.
CREATE PROCEDURE MyProc
	@DAT_POST DATETIME
AS
	SELECT * FROM MyTab WHERE ISNULL(dat_post, '') = ISNULL(@DAT_POST, '')


будет корректно работать?
Пробую - работает. Но я имею в виду корректность данной реализации в целом.
MSSQL 2005.
...
Рейтинг: 0 / 0
Условие сравнения по дате с возможными NULL-значениями
    #39885659
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shanton,

если устраивает такое SELECT CAST('' as date)
...
Рейтинг: 0 / 0
Условие сравнения по дате с возможными NULL-значениями
    #39885666
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А не проще перед запросом SET ANSI_NULLS OFF , и потом просто сравнивать?
...
Рейтинг: 0 / 0
Условие сравнения по дате с возможными NULL-значениями
    #39885678
shanton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
А не проще перед запросом SET ANSI_NULLS OFF , и потом просто сравнивать?

В будущих версиях собираются убрать данную настройку. И не хочется изменять поведение SQL в целом, чтобы не затронуть то что уже работает.
...
Рейтинг: 0 / 0
Условие сравнения по дате с возможными NULL-значениями
    #39885686
shanton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK
shanton,

если устраивает такое SELECT CAST('' as date)

такое не устраивает. Но у меня пустых значений не может быть. Может быть два варианта: NULL или конкретная дата. Просто можно было написать иначе, например:
Код: sql
1.
SELECT * FROM MyTab WHERE ISNULL(dat_post, 0) = ISNULL(@DAT_POST, 0)


или ещё как-то. Если разницы нет, то нечего и думать.
...
Рейтинг: 0 / 0
Условие сравнения по дате с возможными NULL-значениями
    #39885690
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shanton,

Код: sql
1.
WHERE exists(select dat_post intersect select @DAT_POST)
...
Рейтинг: 0 / 0
Условие сравнения по дате с возможными NULL-значениями
    #39885692
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shanton,

автор Но у меня пустых значений не может быть.
конкретная дата 01/01/1900?
...
Рейтинг: 0 / 0
Условие сравнения по дате с возможными NULL-значениями
    #39885696
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shanton,

почему нет разницы? В Вашей транскрипции невозможно использовать индексную оптимизацию.
...
Рейтинг: 0 / 0
Условие сравнения по дате с возможными NULL-значениями
    #39885723
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shanton
В будущих версиях собираются убрать данную настройку. И не хочется изменять поведение SQL в целом, чтобы не затронуть то что уже работает.
И это при том, что данные до сих пор в 2005 версии? и при том, что, несмотря на давние обещания, до сих пор не удалено? как, впрочем, и не реализовали, и даже не пообещали, null-safe compare.

Да и при чём тут "поведение SQL в целом"? я ж вроде вменяемо сказал - OFF, запрос, обратно ON. На один запрос. А если в очередной версии уберут, и вдруг вы на неё перейдёте - так всего и делов один запрос переписать.
...
Рейтинг: 0 / 0
Условие сравнения по дате с возможными NULL-значениями
    #39885728
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
я ж вроде вменяемо сказал - OFF, запрос, обратно ON. На один запрос.

угу, на каждый, где есть сравнение с null = null


Akina
А если в очередной версии уберут, и вдруг вы на неё перейдёте - так всего и делов один запрос переписать.

см. выше.
...
Рейтинг: 0 / 0
Условие сравнения по дате с возможными NULL-значениями
    #39885735
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
shanton
В будущих версиях собираются убрать данную настройку. И не хочется изменять поведение SQL в целом, чтобы не затронуть то что уже работает.
И это при том, что данные до сих пор в 2005 версии? и при том, что, несмотря на давние обещания, до сих пор не удалено? как, впрочем, и не реализовали, и даже не пообещали, null-safe compare.

Да и при чём тут "поведение SQL в целом"? я ж вроде вменяемо сказал - OFF, запрос, обратно ON. На один запрос. А если в очередной версии уберут, и вдруг вы на неё перейдёте - так всего и делов один запрос переписать.



Да, и самое главное. В случаях индексов по вычисляемым колонкам или индексированным вью, ansi_nulls off не поможет.

В примере ниже, индекс по вычисляемой колонке dt2 не может быть использован из-за set ansi_nulls off
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
drop table if exists #t
create table #t (
	dt1	datetime2
	, dt2 as dt1
)

create clustered index i on #t(dt2)



declare @dt datetime2 = null


set ansi_nulls off

select *
from #t with(forceseek)
where 
	dt2 = @dt 

set ansi_nulls on
...
Рейтинг: 0 / 0
Условие сравнения по дате с возможными NULL-значениями
    #39885743
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну тогда только переписывать как

Код: sql
1.
2.
3.
4.
5.
6.
CREATE PROCEDURE MyProc
	@DAT_POST DATETIME
AS
	SELECT * FROM MyTab WHERE dat_post = @DAT_POST
    UNION ALL
	SELECT * FROM MyTab WHERE dat_post IS NULL AND @DAT_POST IS NULL
...
Рейтинг: 0 / 0
Условие сравнения по дате с возможными NULL-значениями
    #39885745
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
Ну тогда только переписывать как

Код: sql
1.
2.
3.
4.
5.
6.
CREATE PROCEDURE MyProc
	@DAT_POST DATETIME
AS
	SELECT * FROM MyTab WHERE dat_post = @DAT_POST
    UNION ALL
	SELECT * FROM MyTab WHERE dat_post IS NULL AND @DAT_POST IS NULL



Выше же показали способ сравнивать

invm
Код: sql
1.
WHERE exists(select dat_post intersect select @DAT_POST)

...
Рейтинг: 0 / 0
Условие сравнения по дате с возможными NULL-значениями
    #39885749
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex
Akina
Ну тогда только переписывать как

Код: sql
1.
2.
3.
4.
5.
6.
CREATE PROCEDURE MyProc
	@DAT_POST DATETIME
AS
	SELECT * FROM MyTab WHERE dat_post = @DAT_POST
    UNION ALL
	SELECT * FROM MyTab WHERE dat_post IS NULL AND @DAT_POST IS NULL




Выше же показали способ сравнивать

invm
Код: sql
1.
WHERE exists(select dat_post intersect select @DAT_POST)


В SQL2005 ещё не было INTERSECT (если не ошибаюсь)
...
Рейтинг: 0 / 0
Условие сравнения по дате с возможными NULL-значениями
    #39885752
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap
msLex
пропущено...


Выше же показали способ сравнивать

пропущено...
В SQL2005 ещё не было INTERSECT (если не ошибаюсь)
Посыпаю голову пеплом!
Ссылка на меня же меня опровергает: https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=309733&msg=2829696
...
Рейтинг: 0 / 0
Условие сравнения по дате с возможными NULL-значениями
    #39885753
shanton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm

Код: sql
1.
WHERE exists(select dat_post intersect select @DAT_POST)


в 2005-м работает.
...
Рейтинг: 0 / 0
Условие сравнения по дате с возможными NULL-значениями
    #39885754
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shanton
invm

Код: sql
1.
WHERE exists(select dat_post intersect select @DAT_POST)



в 2005-м работает.
Тогда непонятно, что вам ещё нужно? И даже индексы могут использоваться, если есть.
...
Рейтинг: 0 / 0
Условие сравнения по дате с возможными NULL-значениями
    #39885762
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap
shanton
пропущено...

в 2005-м работает.
Тогда непонятно, что вам ещё нужно? И даже индексы могут использоваться, если есть.



Хмм, с вычисляемыми полями интерсект тоже не очень то работает


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
drop table if exists #t
create table #t (
	dt1	datetime2
	, dt2 as dt1 
)

create clustered index i on #t(dt2)



declare @dt datetime2 = null




select *
from #t with(forceseek)
where 
	exists(
		select dt2
		intersect 
		select @dt
	)
...
Рейтинг: 0 / 0
Условие сравнения по дате с возможными NULL-значениями
    #39885772
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все чудесатее и чудесатее (с)

А так, работает

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
drop table if exists #t
create table #t (
	dt1	datetime
	, dt2 as cast(dt1 as datetime2)
)

create clustered index i on #t(dt2)



declare @dt datetime2 = null




select *
from #t with(forceseek)
where 
	exists(
		select dt2
		intersect 
		select @dt
	)
...
Рейтинг: 0 / 0
Условие сравнения по дате с возможными NULL-значениями
    #39885804
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex
все чудесатее и чудесатее (с)
Ничего чудесатого.
Просто в первом случае в предикаты подставляется dt1 вместо dt2, поэтому и не работает.
...
Рейтинг: 0 / 0
Условие сравнения по дате с возможными NULL-значениями
    #39885807
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
msLex
все чудесатее и чудесатее (с)
Ничего чудесатого.
Просто в первом случае в предикаты подставляется dt1 вместо dt2, поэтому и не работает.

Это понятно.
Не понятно, почему в первом случае не может использовать индексированный dt2
...
Рейтинг: 0 / 0
Условие сравнения по дате с возможными NULL-значениями
    #39885810
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex
Не понятно, почему в первом случае не может использовать индексированный dt2
Индекс по dt2, а предикат по dt1. Оптимизатор сам себя обманул.
...
Рейтинг: 0 / 0
Условие сравнения по дате с возможными NULL-значениями
    #39885814
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
msLex
Не понятно, почему в первом случае не может использовать индексированный dt2
Индекс по dt2, а предикат по dt1. Оптимизатор сам себя обманул.

Так же (предикат по dt1, вместо dt2) происходит при set ansi_nulls off, но про это хоть явно указано в доке, а тут...

Хотя, может, это и не связанные вещи.
...
Рейтинг: 0 / 0
Условие сравнения по дате с возможными NULL-значениями
    #39885837
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex,

От настройки ansi_nulls зависит используемость индекса. А подмена столбца в предикате нет.
...
Рейтинг: 0 / 0
Условие сравнения по дате с возможными NULL-значениями
    #39885906
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shanton,

Если вас беспокоит скорость и оптимальность, то напишите

Код: sql
1.
SELECT * FROM MyTab WHERE dat_post = @DAT_POST OR (dat_post IS NULL AND @DAT_POST IS NULL) 



ибо ISNULL чего-то сжирает

А вот это будет хуже

Код: sql
1.
2.
3.
SELECT * FROM MyTab WHERE dat_post = @DAT_POST
    UNION ALL
SELECT * FROM MyTab WHERE dat_post IS NULL AND @DAT_POST IS NULL
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Условие сравнения по дате с возможными NULL-значениями
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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