你现在这这样的 SQL ,where 条件中,随机日期范围的那一部分,在每次 where 的时候都会执行一次 RAND ,所以就会有问题,要解决这个问题,那就要使得这个 RAND 只执行一次,如果是在 MySQL 8 中,可以使用 With 语句。 with mo1 as (select DATE_FORMAT(DATE_ADD('2023-11-01', INTERVAL FLOOR(RAND() * DATEDIFF(CURDATE(), '2023-11-01')) DAY), '%Y-%m') as month) SELECT * FROM teacher join mo1 on mo1.month = DATE_FORMAT(create_time, '%Y-%m') 这样,就可以获得预期的结果了。但是,这样并不好。 * 1、对于这个查询条件,你完全可以在代码中进行生成,从外部传进来,而不必要使用 SQL 语句,这样在低版本中也可以使用,代码也更好读。 * 2、你在对查询列使用了 函数 `DATE_FORMAT(create_time, '%Y-%m')` 这样将会导致 MySQL 在查询数据的时候,无法使用到索引,如果数据量大的话,查询就会很慢。 虽然在 MySQL 8 中,你可以使用 函数索引,来创建索引从而提高效率。 alter table teacher add index idx_month((DATE_FORMAT(create_time, '%Y-%m'))); 但是这样也不是很好的办法,更建议的是,从外部传入的参数,把日期补全,把查询改成 between 的方式,再直接为 create_time 创建索引。 SELECT * FROM teacher where create_time between '2024-01-01 00:00:00' and '2024-01-31 23:59:59'; # 或者 SELECT * FROM teacher where create_time >= '2024-01-01 00:00:00' and create_time < '2024-02-01 00:00:00';