SELECT DATE_FORMAT(create_time, '%Y-%m') AS month, FORMAT(count(1) / DAY(LAST_DAY(create_time)) * 100, 2) AS applyRate FROM sp_immigration GROUP BY DATE_FORMAT(create_time, '%Y-%m'); 报错Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'ycyy_sj.sp_immigration.create_time' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by,如何更改?
时间: 2024-03-09 16:50:21 浏览: 23
这个错误是因为 MySQL 5.7.5 版本以后,sql_mode 默认启用了 ONLY_FULL_GROUP_BY 模式,该模式要求 SELECT 语句中的非聚合列必须出现在 GROUP BY 子句中或者使用聚合函数进行处理。
如果你想要更改 sql_mode,可以通过以下两种方式之一进行更改:
1. 修改 MySQL 的配置文件 my.cnf 或者 my.ini,在 [mysqld] 段中加上以下语句:
```
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
```
其中,sql_mode 的值可以根据自己的需求进行修改。
2. 在 MySQL 客户端中执行以下语句:
```
SET GLOBAL sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
```
注:该方法修改的是全局的 sql_mode,如果需要修改 session 的 sql_mode,可以使用 SET SESSION sql_mode='...' 进行设置。
相关问题
SELECT DATE_FORMAT(create_time, '%Y-%m') AS month, FORMAT(count(1) / DAY(LAST_DAY(create_time)) * 100, 2) AS applyRate FROM sp_immigration GROUP BY DATE_FORMAT(create_time, '%Y-%m'); 报错Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'ycyy_sj.sp_immigration.create_time' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by,如何更改sql,进而不报错?
为了避免这个错误,你可以将非聚合列 create_time 进行聚合,或者将其移除 SELECT 列表。以下是两种解决方法:
1. 将非聚合列 create_time 进行聚合,例如使用 MIN 或者 MAX 函数:
```
SELECT DATE_FORMAT(create_time, '%Y-%m') AS month,
FORMAT(COUNT(1) / DAY(LAST_DAY(create_time)) * 100, 2) AS applyRate,
MAX(create_time) AS create_time
FROM sp_immigration
GROUP BY DATE_FORMAT(create_time, '%Y-%m');
```
2. 将非聚合列 create_time 从 SELECT 列表中移除:
```
SELECT DATE_FORMAT(create_time, '%Y-%m') AS month,
FORMAT(COUNT(1) / DAY(LAST_DAY(create_time)) * 100, 2) AS applyRate
FROM sp_immigration
GROUP BY DATE_FORMAT(create_time, '%Y-%m');
```
这两种方法都可以避免这个错误,你可以根据实际需求选择其中一种。
QueryWrapper DATE_FORMAT(time, '%Y-%m-%d')
在使用QueryWrapper的时候,可以使用`DATE_FORMAT`函数来格式化日期字段。`DATE_FORMAT`函数用于将日期字段按照指定的格式进行格式化。
假设你有一个时间字段`time`,你想要将其格式化为`YYYY-MM-DD`的形式,可以使用如下的方式:
```java
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class YourService {
@Autowired
private YourMapper yourMapper;
public List<YourEntity> getEntitiesByDate() {
QueryWrapper<YourEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.apply("DATE_FORMAT(time, '%Y-%m-%d')", "2021-12-31");
// 其他查询条件...
return yourMapper.selectList(queryWrapper);
}
}
```
在上述示例中,我们创建了一个`QueryWrapper<YourEntity>`对象,并使用`apply`方法来应用`DATE_FORMAT`函数,指定格式化的日期为`2021-12-31`。你可以在`apply`方法中添加其他查询条件来满足你的需求。
这样,你就可以在使用QueryWrapper时使用`DATE_FORMAT`函数对时间字段进行格式化了。请注意,具体函数的写法可能会因为你所使用的数据库而有所不同,请根据你所使用的数据库的函数语法进行相应的调整。