如何用T-SQL查询60天未发起数据库查询的计算机名称
解决方法
要筛选出60天内没有任何查询的计算机,核心是先找出每台计算机的最新查询时间,再判断这个时间是否早于60天前,最后提取符合条件的计算机名称。
方法一:GROUP BY + HAVING 子句
这是最直接的实现方式,先按计算机名称分组,计算每组的最新查询时间,再筛选出最新时间超过60天的组:
SELECT computer_name FROM queries GROUP BY computer_name HAVING MAX(date_time) < DATE_SUB(NOW(), INTERVAL 60 DAY);
如果你的date_time是字符串格式(比如示例中的20240508000000),需要先转换成日期类型再计算:
SELECT computer_name FROM queries GROUP BY computer_name HAVING MAX(STR_TO_DATE(date_time, '%Y%m%d%H%i%s')) < DATE_SUB(NOW(), INTERVAL 60 DAY);
方法二:子查询获取最新时间
如果对GROUP BY逻辑不太熟悉,也可以用子查询先提取每台计算机的最新查询记录,再筛选时间条件:
SELECT q.computer_name FROM ( SELECT computer_name, MAX(date_time) AS last_query_time FROM queries GROUP BY computer_name ) q WHERE q.last_query_time < DATE_SUB(NOW(), INTERVAL 60 DAY);
针对字符串格式的时间,同样需要转换:
SELECT q.computer_name FROM ( SELECT computer_name, MAX(STR_TO_DATE(date_time, '%Y%m%d%H%i%s')) AS last_query_time FROM queries GROUP BY computer_name ) q WHERE q.last_query_time < DATE_SUB(NOW(), INTERVAL 60 DAY);
补充:包含从未发起过查询的计算机
如果你的系统中有一张记录所有计算机的表(比如命名为computers),可以同时找出在queries表中完全没有记录的计算机,合并两种情况:
SELECT c.computer_name FROM computers c LEFT JOIN ( SELECT computer_name, MAX(date_time) AS last_query_time FROM queries GROUP BY computer_name ) q ON c.computer_name = q.computer_name WHERE q.last_query_time IS NULL OR q.last_query_time < DATE_SUB(NOW(), INTERVAL 60 DAY);
原语句的问题说明
你写的WHERE date_time > 20240508000000是筛选单条查询记录时间晚于指定日期的行,会返回所有符合该时间条件的记录,而非按计算机整体判断是否60天无查询。我们需要先按计算机聚合数据,判断其最后一次查询是否在60天前,这才是你需要的结果。
内容的提问来源于stack exchange,提问作者Korgon
相关产品推荐
相关产品推荐

