powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Фильтр с условием (Where, Case)
6 сообщений из 6, страница 1 из 1
Фильтр с условием (Where, Case)
    #39679066
Азмузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется таблица с данными
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE TABLE [Make](
	[VCode] [bigint] IDENTITY(1,1) NOT NULL,
        [Name] [varchar(255)] NULL,
	[Deadline] [datetimeoffset](7) NULL,
	[isDone] [bit] NULL,
	[DoneDate] [datetimeoffset](7) NULL,
	[BeginDate] [datetimeoffset](7) NULL,
)

Insert into [Make] (Name, Deadline, isDone, DoneDate, BeginDate) 
values ('Подготовка ТЗ', '2018-01-18 16:01:01.5590000 +05:00', NULL, NULL, '2018-01-18 16:01:01.5590000 +05:00'), 
('Подготовка КП', '2018-01-16 16:10:09.8310000 +05:00', 1, 1, '2018-01-16 16:10:09.8310000 +05:00'),
('Поставка', '2017-12-26 10:24:10.7100000 +05:00', 0, 1, NULL),
('Звонок', '2018-02-01 13:06:40.7010000 +05:00', 1, '2018-04-27 13:54:11.2680000 +05:00', '2018-02-24 13:54:11.2680000 +05:00'), 
('Встреча', '2018-04-16 11:08:19.9630000 +05:00', NULL, NULL, '2018-04-16 11:08:19.9630000 +05:00'),
('Договор', '2018-03-07 13:22:44.4800000 +05:00', NULL, NULL, '2018-03-07 13:22:44.4800000 +05:00')




нужно вытащить данные со следующим условием:
если
Код: sql
1.
isDone is NULL

, то наложить такой фильтр
Код: sql
1.
2.
 ((@bDate is null or BeginDate > @bDate) or (@bDate is null or Deadline > @bDate)) and 
	((@eDate is null or BeginDate < @eDate) or (@eDate is null or Deadline < @eDate))


ecли
Код: sql
1.
isDone not null

, то
Код: sql
1.
2.
(@bDate is null or DoneDate > @bDate) and
	(@bDate is null or DoneDate < @eDate)




Код: sql
1.
2.
declare @bDate datetimeoffset(7),@eDate datetimeoffset(7)
select @bDate=NULL,@eDate=NULL



это переменные, можно пока null сделать
...
Рейтинг: 0 / 0
Фильтр с условием (Where, Case)
    #39679071
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Азмузи,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
WHERE 
(
isDone is NULL AND 
 ((@bDate is null or BeginDate > @bDate) or (@bDate is null or Deadline > @bDate)) and 
	((@eDate is null or BeginDate < @eDate) or (@eDate is null or Deadline < @eDate))
) OR
(
isDone is NOT NULL  AND
(@bDate is null or DoneDate > @bDate) and
	(@bDate is null or DoneDate < @eDate)
)
...
Рейтинг: 0 / 0
Фильтр с условием (Where, Case)
    #39679076
Азмузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ошиблась, вот так
Код: sql
1.
2.
3.
4.
5.
6.
7.
Insert into [Make] (Name, Deadline, isDone, DoneDate, BeginDate) 
values ('Подготовка ТЗ', '2018-01-18 16:01:01.5590000 +05:00', NULL, NULL, '2018-01-18 16:01:01.5590000 +05:00'), 
('Подготовка КП', '2018-01-16 16:10:09.8310000 +05:00', 1, '2018-01-16 16:10:09.8310000 +05:00', '2018-01-16 16:10:09.8310000 +05:00'),
('Поставка', '2017-12-26 10:24:10.7100000 +05:00', 0, 1, NULL),
('Звонок', '2018-02-01 13:06:40.7010000 +05:00', 1, '2018-04-27 13:54:11.2680000 +05:00', '2018-02-24 13:54:11.2680000 +05:00'), 
('Встреча', '2018-04-16 11:08:19.9630000 +05:00', NULL, NULL, '2018-04-16 11:08:19.9630000 +05:00'),
('Договор', '2018-03-07 13:22:44.4800000 +05:00', NULL, NULL, '2018-03-07 13:22:44.4800000 +05:00')
...
Рейтинг: 0 / 0
Фильтр с условием (Where, Case)
    #39679087
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Азмузи,

Разделите данные на два набора (таблицы). В одной таблице храните невыполненные, во второй выполненные.

Если это невозможно, то напишите два запроса с разными фильтрами. Фильтры можно объединить по примеру выше, но такой фильтр может не слишком эффективно работать при больших объемах данных.
...
Рейтинг: 0 / 0
Фильтр с условием (Where, Case)
    #39679663
Glebanski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Microsoft,

Сделай же наконец LEAST/GREATEST. Почему мы должны писать тысячи CASE-ов и OR-ов в 21-м веке?

Код: sql
1.
COALESCE(@bDate,'0001-01-01')  < LEAST (BeginDate, Deadline)  
...
Рейтинг: 0 / 0
Фильтр с условием (Where, Case)
    #39679904
Диклевич Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Glebanski,

Легко
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
IF OBJECT_ID('tempdb..#t') IS NOT NULL DROP TABLE #t;

CREATE TABLE #t (BeginDate date, Deadline date);

INSERT INTO #t VALUES ('20180101', '20180201'), ('20180305', '20180225'), ('20180301', NULL);

SELECT
	t.*
	,(SELECT MAX(GreatestDate) FROM (VALUES (t.BeginDate), (t.Deadline)) AS v(GreatestDate)) AS [GreatestDate]
	,(SELECT MIN(LeastDate) FROM (VALUES (t.BeginDate), (t.Deadline)) AS v(LeastDate)) AS [LeastDate]
FROM #t t;
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Фильтр с условием (Where, Case)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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