Получить записи по датам, которые присутствуют и не присутствуют - PullRequest
3 голосов
/ 31 октября 2019

Таблица :

create table dttest
(
    names varchar(20),
    coldate datetime
);

Записи :

insert into dttest values('A','2019-10-31');
insert into dttest values('A','2019-10-30');
insert into dttest values('A','2019-10-29');
insert into dttest values('B','2019-10-14');
insert into dttest values('B','2019-10-22');

Запрос : я пытаюсь получитьтолько те записи, которые присутствуют в определенные даты и не присутствуют в некоторые даты .

Попробуйте 1:

SELECT * 
FROM dttest 
WHERE (CONVERT(VARCHAR(10),CAST(coldate as DATE),105) NOT IN ('31-10-2019','22-10-2019')) AND 
      (CONVERT(VARCHAR(10),CAST(coldate as DATE),105) IN ('14-10-2019'))    

Вывод:

names       coldate
------------------------------
B           2019-10-14 00:00:00.000   

B не должно приходить, поскольку оно также присутствует в 22-10-2019, ожидаемый результат равен NULL.

Попробуйте 2:

SELECT * 
FROM dttest t
WHERE NOT EXISTS 
(
    SELECT 1 
    FROM dttest t1 
    WHERE t.names = t1.names  
    AND (CONVERT(VARCHAR(10),CAST(t1.coldate as DATE),105) NOT IN ('31-10-2019','30-10-2019'))
) AND
EXISTS
( 
    SELECT 1 FROM dttest t2 
    WHERE t.names = t2.names
    AND (CONVERT(VARCHAR(10),CAST(t2.coldate as DATE),105) IN ('14-10-2019')) 
 )

Нет результата, но ожидаемый результат равен B.

1 Ответ

2 голосов
/ 31 октября 2019

У вас есть двойное отрицательное условие (NOT EXISTS и NOT IN) во втором запросе. Таким образом, следующий запрос должен получить ожидаемый результат:

SELECT DISTINCT names
FROM dttest 
WHERE NOT EXISTS (
  SELECT 1 
  FROM dttest t1 
  WHERE CONVERT(VARCHAR(10), CAST(coldate as DATE), 105) IN ('31-10-2019','30-10-2019') 
    AND t1.names = dttest.names
) AND EXISTS (
  SELECT 1 
  FROM dttest t1 
  WHERE CONVERT(VARCHAR(10), CAST(coldate as DATE), 105) IN ('14-10-2019')
    AND t1.names = dttest.names
)

демо на dbfiddle.uk

...