Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Фильтр с условием (Where, Case)  [new]
Азмузи
Member

Откуда:
Сообщений: 9
Имеется таблица с данными
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')



нужно вытащить данные со следующим условием:
если
isDone is NULL
, то наложить такой фильтр
 ((@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ли
isDone not null
, то
(@bDate is null or DoneDate > @bDate) and
	(@bDate is null or DoneDate < @eDate)



declare @bDate datetimeoffset(7),@eDate datetimeoffset(7)
select @bDate=NULL,@eDate=NULL


это переменные, можно пока null сделать
25 июл 18, 16:04    [21601778]     Ответить | Цитировать Сообщить модератору
 Re: Фильтр с условием (Where, Case)  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Азмузи,

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)
)
25 июл 18, 16:06    [21601788]     Ответить | Цитировать Сообщить модератору
 Re: Фильтр с условием (Where, Case)  [new]
Азмузи
Member

Откуда:
Сообщений: 9
ошиблась, вот так
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')
25 июл 18, 16:07    [21601795]     Ответить | Цитировать Сообщить модератору
 Re: Фильтр с условием (Where, Case)  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7768
Азмузи,

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

Если это невозможно, то напишите два запроса с разными фильтрами. Фильтры можно объединить по примеру выше, но такой фильтр может не слишком эффективно работать при больших объемах данных.
25 июл 18, 16:18    [21601831]     Ответить | Цитировать Сообщить модератору
 Re: Фильтр с условием (Where, Case)  [new]
Glebanski
Member

Откуда: Msk ->NL
Сообщений: 308
Microsoft,

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

COALESCE(@bDate,'0001-01-01')  < LEAST (BeginDate, Deadline)  
26 июл 18, 14:45    [21604685]     Ответить | Цитировать Сообщить модератору
 Re: Фильтр с условием (Where, Case)  [new]
Диклевич Александр
Member

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

Легко
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;
26 июл 18, 21:40    [21606305]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить