Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Упростить выражение в where / 14 сообщений из 14, страница 1 из 1
27.03.2019, 09:33
    #39792021
x17.mstu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Упростить выражение в where
(
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)
)

Как-нибудь можно упростить выражение или без вариантов?
...
Рейтинг: 0 / 0
27.03.2019, 09:36
    #39792023
x17.mstu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Упростить выражение в where
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)
)
...
Рейтинг: 0 / 0
27.03.2019, 10:35
    #39792073
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Упростить выражение в where
x17.mstuКак-нибудь можно упростить выражение или без вариантов?Для начала надо убрать синтаксические ошибки: isnull(CloseDate)

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



Далее, нужно убрать незначащие в выражении слова (CONVERT), что бы упростить понимание, добавить тег SRC, и после преобразования получится примерно так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
(
	OpenDate = $$vExportDate
)
OR 
(
	CloseDate = $$vExportDate
	and
	OpenDate <> CloseDate
)
OR
(
	OpenDate != $$vExportDate
	and 
	CloseDate >= $$vExportDate
)	
...
Рейтинг: 0 / 0
27.03.2019, 12:19
    #39792180
x17.mstu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Упростить выражение в where
Написал через convert потому что так запрос выполняется
Не понятно только как упростить

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
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
)
...
Рейтинг: 0 / 0
27.03.2019, 12:22
    #39792184
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Упростить выражение в where
x17.mstuНе понятно только как упроститьОдно же упрощение я показал.
И план написал, как его пытаться сделать.
Вот и упрощайте
...
Рейтинг: 0 / 0
27.03.2019, 13:42
    #39792299
x17.mstu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Упростить выражение в where
alexeyvg,

Не понятно куда делось условие OpenDate=CloseDate ?
...
Рейтинг: 0 / 0
27.03.2019, 15:42
    #39792418
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Упростить выражение в where
x17.mstualexeyvg,

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

Сделаем выражение читабельным:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
(
	--	(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
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
(
	--	(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)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
(
	--	(1)
	OpenDate != $$vExportDate
	and 
	CloseDate >= $$vExportDate
)	
OR
(
	--	(2)
	OpenDate = $$vExportDate 
	OR 
	CloseDate = $$vExportDate
)

...
Рейтинг: 0 / 0
27.03.2019, 17:22
    #39792489
x17.mstu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Упростить выражение в where
alexeyvg,

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

Такие записи не попадут в выборку
...
Рейтинг: 0 / 0
27.03.2019, 18:09
    #39792507
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Упростить выражение в where
x17.mstualexeyvg,

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

Такие записи не попадут в выборкуКак это???
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
(
	--	(1) - тут неважно, потому что выражение (2) равно TRUE
	OpenDate != $$vExportDate
	and 
	CloseDate >= $$vExportDate
)	
OR
(
	--	(2) - получаем, что выражение равно: TRUE ИЛИ FALSE = TRUE
	OpenDate = $$vExportDate -- Тут условие выполняется, значит, TRUE.
	OR -- Тут стоит ИЛИ
	CloseDate = $$vExportDate -- CloseDate = NULL , то есть выражение FALSE
)
...
Рейтинг: 0 / 0
27.03.2019, 18:16
    #39792512
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Упростить выражение в where
x17.mstualexeyvg,

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

Такие записи не попадут в выборкуИ вообще, если сами даже не пытаетесь, то не думайте, пост-копи в код, и закрыть тикет!
...
Рейтинг: 0 / 0
28.03.2019, 11:50
    #39792845
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Упростить выражение в where
Ему похоже нужен тупой between
Код: sql
1.
$$vExportDate BETWEEN ISNULL( [openDate], '19000101' ) AND ISNULL( [closeDate], '22000101' )
...
Рейтинг: 0 / 0
28.03.2019, 13:32
    #39792920
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Упростить выражение в where
Руслан ДамировичЕму похоже нужен тупой between
Код: sql
1.
$$vExportDate BETWEEN ISNULL( [openDate], '19000101' ) AND ISNULL( [closeDate], '22000101' )

Там запутаннее, все записи с CloseDate >= $$vExportDate попадают, при условии, что OpenDate не равно $$vExportDate.

Поддерживаю, можно было бы попробовать рассказать, что нужно, языком бизнес-логики, без кода. Может, тогда получится написать условие эффективнее.
...
Рейтинг: 0 / 0
28.03.2019, 14:34
    #39792967
Wlr-l
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Упростить выражение в where
x17.mstu,

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

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

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

Все эти действия хорошо формализованы и гарантированно приведут к успеху.
Любые другие умозаключения не дадут гарантии, что любой набор исходных данных даст нужный результат.
...
Рейтинг: 0 / 0
29.03.2019, 16:16
    #39793737
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Упростить выражение в where
Wlr-lx17.mstu,
Чтобы упростить логическое выражение нужно нужно не гадать, а:
1. Построить таблицу истинности.
2. Найти минимальную ДНФ.
Все эти действия хорошо формализованы и гарантированно приведут к успеху.
Любые другие умозаключения не дадут гарантии, что любой набор исходных данных даст нужный результат.
Ну как тут не вспомнить анекдот про чукчу:
Ты, чукча, не мудри, ты пальцем покажи
:)
Если б ТС мог предлагаемое провернуть, он бы сюда не пришел...
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Упростить выражение в where / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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