表格:
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
。
最佳答案
您的第二个查询有双重否定条件(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
)
关于sql-server - 按存在和不存在的日期获取记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58640690/