如何格式化SQL日期显示_掌握DATE_FORMAT函数的高级用法
DATE_FORMAT 返回 NULL 主因是首参非合法日期如空字符串、0000-00-00 或非法格式如 2024-13-01MySQL 严格模式拒解析非严格模式转为 0 导致结果为 NULL。DATE_FORMAT 为什么返回 NULL 而不是你想要的日期字符串常见现象DATE_FORMAT 返回 NULL但字段明明有值。最可能的原因是传入的第一个参数不是合法的日期类型——比如传了空字符串、0000-00-00、或一个被 MySQL 隐式转成 0 的非法时间如 2024-13-01。MySQL 在严格模式下会拒绝解析非严格模式则转成 0000-00-00而 DATE_FORMAT(NULL, ...) 或 DATE_FORMAT(0, ...) 都返回 NULL。实操建议先用 SELECT col, IS_DATE(col), IS_VALID_DATE(col)MySQL 8.0.29或 SELECT col, STR_TO_DATE(col, %Y-%m-%d) 检查原始值是否可解析避免直接对 VARCHAR 字段调用 DATE_FORMAT先用 STR_TO_DATE 转一次再格式化注意时区如果字段是 TIMESTAMP 类型DATE_FORMAT 输出受会话时区影响DATETIME 则不受影响MySQL 5.7 和 8.0 中 %w、%W、%a 的行为差异%w周日0、%W全名如 Monday、%a缩写如 Mon看着简单但在不同版本和 locale 下容易出错。MySQL 5.7 默认用 C locale%W 固定输出英文8.0 开始支持更完整的 locale 设置但需显式指定否则仍走默认。实操建议不要依赖系统 locale 自动切换语言显式用 SET lc_time_names zh_CN 再执行查询该设置只对当前会话有效%w 始终返回数字0–6但它的“周日0”是 MySQL 自定义和 ISO 8601周一1冲突做周统计时务必确认业务规则若需 ISO 周数用 %x %v年份周序号但注意它按周一为每周起点且 2023-12-31 可能属于 2024 年第 1 周在 WHERE 条件里滥用 DATE_FORMAT 导致索引失效典型错误写 WHERE DATE_FORMAT(create_time, %Y-%m) 2024-04 查询当月数据。这会让 create_time 上的索引完全失效因为函数作用于列本身优化器无法做范围扫描。 幻导航网 发现优质实用网站,开启网络探索之旅