导出对账单时,对方要求日期写成 20261028 这种八位数字,可 SELECT 出来是 2026-10-28 00:00:00,还得手工改。其实一条 DATE_FORMAT 就能转。字段是 timestamp 的话,结果还会受会话时区影响,datetime 不受。

写法是 SELECT DATE_FORMAT(create_time, '%Y%m%d') FROM orders。%Y 是四位年份,%m 是两位月份,%d 是两位日期,缺位补零。别把 %m 写成 %c,%c 不补零,三月会变成 3,拼出来只有七位。大小写也不能乱改,%M 是英文月份名,%D 带英文后缀,结果完全不是想要的数字。

反向把八位数字转回日期

拿到 20261028 这样的字符串,用 STR_TO_DATE('20261028', '%Y%m%d') 转成日期类型,再参与比较或者计算。直接拿字符串和日期字段比,MySQL 会做隐式转换,碰上非法值只给警告,结果不对还不好查。导入外部数据时先转成日期再入库,字段类型统一,后面省很多事。

转换后按字符串排序

DATE_FORMAT 返回的是字符串,yyyymmdd 这种格式按字符串排序恰好和日期顺序一致,所以排序不会出错。换成 yyyy-mm-dd 也一样。但别拿它做范围查询,那是另一回事,字符串比较和日期比较在边界上容易差一天。按月汇总时 GROUP BY 后面放 DATE_FORMAT 没问题,数据量大可以建生成列再建索引。

WHERE 里这么写走不了索引

WHERE DATE_FORMAT(create_time, '%Y%m%d') = '20261028' 这种写法,字段被函数包住,索引直接用不上,几百万行能扫到怀疑人生。改成 create_time >= '2026-10-28' AND create_time < '2026-10-29',范围查询才能走索引。mysql日期格式转换yyyymmdd 的需求,八成只出现在展示层,查询条件尽量保持原样。

做法很简单:展示用 DATE_FORMAT,条件别套函数。格式串里一个字母差一位,结果就全变,写完拿一条已知数据对一下最稳。