You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL使用curdate()统计PPPOE断连次数异常问题

解决PPPOE断连次数统计SQL的问题

嘿,我帮你捋捋这个问题哈!你遇到的情况其实挺常见的,咱们一步步拆解:

问题根源分析

你原来指定固定日期的SQL能正常统计,换成curdate()就只能看到断连1次的客户,主要有两个核心原因:

  1. 统计逻辑的字段选错了:你用acctstarttime(连接开始时间)来筛选,但断连次数应该对应acctstoptime(连接断开时间)。指定过去日期时,那天的所有会话都已经断开了,所以每条acctstarttime记录都对应一次断连;但当天的话,很多会话还在活跃状态(没断开),这些记录不会被算作断连,自然统计不全。
  2. 函数包裹字段导致索引失效:DATE_FORMAT(acctstarttime, '%Y-%m-%d')这种写法会让MySQL没法用acctstarttime上的索引,查询时可能扫不到全量数据,导致部分用户的记录没被捞出来。

修正后的SQL方案

方案1:统计当天实际断连的次数(推荐)

这个是真正对应你“断连次数”需求的写法,只统计当天已经断开的会话:

select 
  username, 
  count(*) as disconnect_count, 
  DATE_FORMAT(min(acctstoptime), '%Y-%m-%d') as disconnect_date
from radius_db.radacct 
where 
  acctstoptime >= curdate() 
  and acctstoptime < curdate() + interval 1 day
  and acctstoptime is not null -- 排除还没断开的活跃会话
group by username 
order by disconnect_count desc 
into outfile '/var/your/output/path.csv'
fields terminated by ',' 
enclosed by '"'
lines terminated by '\n';

方案2:统计当天发起的连接次数(如果这是你的真实需求)

要是你其实想统计当天所有发起过的连接(不管有没有断开),就用这个优化后的写法,避免索引失效:

select 
  username, 
  count(*) as connect_count, 
  DATE_FORMAT(min(acctstarttime), '%Y-%m-%d') as connect_date
from radius_db.radacct 
where 
  acctstarttime >= curdate() 
  and acctstarttime < curdate() + interval 1 day
group by username 
order by connect_count desc 
into outfile '/var/your/output/path.csv'
fields terminated by ',' 
enclosed by '"'
lines terminated by '\n';

额外说明

  • 用count(*)代替count(username),效率更高,结果也完全一致(只要username字段不为空);
  • 给into outfile加了格式参数,避免输出的CSV格式混乱,方便后续处理;
  • 范围查询>= curdate() and < curdate() + interval 1 day能完美匹配当天的所有时间,还能利用字段上的索引,查询速度更快。

内容的提问来源于stack exchange,提问作者Mr.Muu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:15:38