Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Упростить выражение в where  [new]
x17.mstu
Member

Откуда:
Сообщений: 274
(
CONVERT(DATETIME,(isnull(OpenDate),'9999-12-31',OpenDate)) != CONVERT(DATETIME, $$vExportDate)
and
CONVERT(DATETIME,(isnull(CloseDate),'9999-12-31',CloseDate)) >= CONVERT(DATETIME, $$vExportDate)
)
OR
(

(
to_date(OpenDate,'yyyy-mm-dd') = CONVERT(DATETIME, $$vExportDate) OR CONVERT(DATETIME, CloseDate) = CONVERT(DATETIME, $$vExportDate)
)
and
(
CONVERT(DATETIME, OpenDate)<> CONVERT(DATETIME, CloseDate)
or
OpenDate is null
or
CloseDate is null
)
)
OR
(
CONVERT(DATETIME, OpenDate) = CONVERT(DATETIME, $$vExportDate)
and
CONVERT(DATETIME, OpenDate) = CONVERT(DATETIME, CloseDate)
)

Как-нибудь можно упростить выражение или без вариантов?
27 мар 19, 09:33    [21844583]     Ответить | Цитировать Сообщить модератору
 Re: Упростить выражение в where  [new]
x17.mstu
Member

Откуда:
Сообщений: 274
x17.mstu,

OR
(
CONVERT(DATETIME,(isnull(OpenDate),'9999-12-31',OpenDate)) != CONVERT(DATETIME, $$vExportDate)
and
CONVERT(DATETIME,(isnull(CloseDate),'9999-12-31',CloseDate)) >= CONVERT(DATETIME, $$vExportDate)
)
OR
(

(
to_date(OpenDate,'yyyy-mm-dd') = CONVERT(DATETIME, $$vExportDate) OR CONVERT(DATETIME, CloseDate) = CONVERT(DATETIME, $$vExportDate)
)
and
(
CONVERT(DATETIME, OpenDate)<> CONVERT(DATETIME, CloseDate)
or
OpenDate is null
or
CloseDate is null
)
)
OR
(
CONVERT(DATETIME, OpenDate) = CONVERT(DATETIME, $$vExportDate)
and
CONVERT(DATETIME, OpenDate) = CONVERT(DATETIME, CloseDate)
)
27 мар 19, 09:36    [21844587]     Ответить | Цитировать Сообщить модератору
 Re: Упростить выражение в where  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31332
x17.mstu
Как-нибудь можно упростить выражение или без вариантов?
Для начала надо убрать синтаксические ошибки: isnull(CloseDate)

Тем более, что такое выражение непонятно, "кто на ком стоял"?
CONVERT(DATETIME,(isnull(OpenDate),'9999-12-31',OpenDate))


Далее, нужно убрать незначащие в выражении слова (CONVERT), что бы упростить понимание, добавить тег SRC, и после преобразования получится примерно так:
(
	OpenDate = $$vExportDate
)
OR 
(
	CloseDate = $$vExportDate
	and
	OpenDate <> CloseDate
)
OR
(
	OpenDate != $$vExportDate
	and 
	CloseDate >= $$vExportDate
)	
27 мар 19, 10:35    [21844692]     Ответить | Цитировать Сообщить модератору
 Re: Упростить выражение в where  [new]
x17.mstu
Member

Откуда:
Сообщений: 274
Написал через convert потому что так запрос выполняется
Не понятно только как упростить

alexeyvg,

AND 
(
CONVERT(char(10), a.OpenDate , 112)=$$vExportDate
OR
CONVERT(char(10), a.CloseDate , 112)= $$vExportDate
)
AND 
(
CONVERT(char(10), a.OpenDate , 112) !=CONVERT(char(10), a.CloseDate , 112)
OR a.OpenDate IS NULL
OR a.CloseDate IS NULL
)
OR
(
CONVERT(char(10), a.OpenDate , 112)=$$vExportDate
AND
CONVERT(char(10), a.OpenDate , 112)=CONVERT(char(10), a.CloseDate , 112)
)
OR 
(
CONVERT(char(10), a.OpenDate , 112) != $$vExportDate  
AND
CONVERT(char(10), a.CloseDate , 112) >= $$vExportDate
)
27 мар 19, 12:19    [21844877]     Ответить | Цитировать Сообщить модератору
 Re: Упростить выражение в where  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31332
x17.mstu
Не понятно только как упростить
Одно же упрощение я показал.
И план написал, как его пытаться сделать.
Вот и упрощайте
27 мар 19, 12:22    [21844883]     Ответить | Цитировать Сообщить модератору
 Re: Упростить выражение в where  [new]
x17.mstu
Member

Откуда:
Сообщений: 274
alexeyvg,

Не понятно куда делось условие OpenDate=CloseDate ?
27 мар 19, 13:42    [21845045]     Ответить | Цитировать Сообщить модератору
 Re: Упростить выражение в where  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31332
x17.mstu
alexeyvg,

Не понятно куда делось условие OpenDate=CloseDate ?
Может, я как то не так преобразовал?

Сделаем выражение читабельным:
+
(
	--	(1)
	OpenDate != $$vExportDate
	and 
	CloseDate >= $$vExportDate
)	
OR
(
	(
		--	(2)
		OpenDate = $$vExportDate 
		OR 
		CloseDate = $$vExportDate
	)
	and
	(
		--	(3)
		OpenDate <> CloseDate
		or
		OpenDate is null
		or
		CloseDate is null
	)
)
OR 
(
	--	(4)
	OpenDate = $$vExportDate
	and 
	OpenDate = CloseDate
)

Тогда условие (4) может поглотиться условием ((2) и (3)), если в (3) добавмить условие OpenDate = CloseDate
+
(
	--	(1)
	OpenDate != $$vExportDate
	and 
	CloseDate >= $$vExportDate
)	
OR
(
	(
		--	(2)
		OpenDate = $$vExportDate 
		OR 
		CloseDate = $$vExportDate
	)
	and
	(
		--	(3)
		OpenDate <> CloseDate
		or
		OpenDate = CloseDate
		or
		OpenDate is null
		or
		CloseDate is null
	)
)

И далее выражение (3) всегда истинно, при условии истинности (2)
+
(
	--	(1)
	OpenDate != $$vExportDate
	and 
	CloseDate >= $$vExportDate
)	
OR
(
	--	(2)
	OpenDate = $$vExportDate 
	OR 
	CloseDate = $$vExportDate
)
27 мар 19, 15:42    [21845200]     Ответить | Цитировать Сообщить модератору
 Re: Упростить выражение в where  [new]
x17.mstu
Member

Откуда:
Сообщений: 274
alexeyvg,

Для записей у которых CloseDate is null, а OpenDate=$$ExportDate (следуя вашему конечному полученному выражению)

Такие записи не попадут в выборку
27 мар 19, 17:22    [21845289]     Ответить | Цитировать Сообщить модератору
 Re: Упростить выражение в where  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31332
x17.mstu
alexeyvg,

Для записей у которых CloseDate is null, а OpenDate=$$ExportDate (следуя вашему конечному полученному выражению)

Такие записи не попадут в выборку
Как это???
(
	--	(1) - тут неважно, потому что выражение (2) равно TRUE
	OpenDate != $$vExportDate
	and 
	CloseDate >= $$vExportDate
)	
OR
(
	--	(2) - получаем, что выражение равно: TRUE ИЛИ FALSE = TRUE
	OpenDate = $$vExportDate -- Тут условие выполняется, значит, TRUE.
	OR -- Тут стоит ИЛИ
	CloseDate = $$vExportDate -- CloseDate = NULL , то есть выражение FALSE
)
27 мар 19, 18:09    [21845311]     Ответить | Цитировать Сообщить модератору
 Re: Упростить выражение в where  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31332
x17.mstu
alexeyvg,

Для записей у которых CloseDate is null, а OpenDate=$$ExportDate (следуя вашему конечному полученному выражению)

Такие записи не попадут в выборку
И вообще, если сами даже не пытаетесь, то не думайте, пост-копи в код, и закрыть тикет!
27 мар 19, 18:16    [21845316]     Ответить | Цитировать Сообщить модератору
 Re: Упростить выражение в where  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Ему похоже нужен тупой between
$$vExportDate BETWEEN ISNULL( [openDate], '19000101' ) AND ISNULL( [closeDate], '22000101' )
28 мар 19, 11:50    [21845925]     Ответить | Цитировать Сообщить модератору
 Re: Упростить выражение в where  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31332
Руслан Дамирович
Ему похоже нужен тупой between
$$vExportDate BETWEEN ISNULL( [openDate], '19000101' ) AND ISNULL( [closeDate], '22000101' )
Там запутаннее, все записи с CloseDate >= $$vExportDate попадают, при условии, что OpenDate не равно $$vExportDate.

Поддерживаю, можно было бы попробовать рассказать, что нужно, языком бизнес-логики, без кода. Может, тогда получится написать условие эффективнее.
28 мар 19, 13:32    [21846057]     Ответить | Цитировать Сообщить модератору
 Re: Упростить выражение в where  [new]
Wlr-l
Member

Откуда:
Сообщений: 522
x17.mstu,

Чтобы упростить логическое выражение нужно нужно не гадать, а:

1. Построить таблицу истинности.

2. Найти минимальную ДНФ.

Все эти действия хорошо формализованы и гарантированно приведут к успеху.
Любые другие умозаключения не дадут гарантии, что любой набор исходных данных даст нужный результат.
28 мар 19, 14:34    [21846136]     Ответить | Цитировать Сообщить модератору
 Re: Упростить выражение в where  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Wlr-l
x17.mstu,
Чтобы упростить логическое выражение нужно нужно не гадать, а:
1. Построить таблицу истинности.
2. Найти минимальную ДНФ.
Все эти действия хорошо формализованы и гарантированно приведут к успеху.
Любые другие умозаключения не дадут гарантии, что любой набор исходных данных даст нужный результат.

Ну как тут не вспомнить анекдот про чукчу:
Ты, чукча, не мудри, ты пальцем покажи
:)
Если б ТС мог предлагаемое провернуть, он бы сюда не пришел...
29 мар 19, 16:16    [21847308]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить