sql-server - 按存在和不存在的日期获取记录

标签 sql-server sql-server-2012

表格:

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 EXISTSNOT 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
)

demo on dbfiddle.uk

关于sql-server - 按存在和不存在的日期获取记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58640690/

相关文章:

java - 未找到类 : Could not load com. microsoft.sqlserver.jdbc.Nanos

sql - 如何查询一个数据库,如果没有返回结果再查询另一个数据库?

SQL Server 事件探查器显示正在调用但实际上并未执行的存储过程

sql-server - 将 SQL Server 2012 转换为 SQL Azure

java - SQL Server "Application=Intent"不工作 JDBC

sql-server - 备份和恢复 SQL Server 数据库文件组

sql-server - Sql Server ldf 文件增长非常快

sql - 如何在 SQL Server 2008 上安装全文搜索

sql - 如何根据同一个表中的现有记录更新字段

sql - 从 SQL SERVER 中的 CTE 删除行