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

MySQL:根据'MMM YYYY'格式计算月份首尾日期的正确方法

解决MySQL中'MMM YYYY'格式日期转换为起始/结束日期的问题

报错原因

你的SQL执行报错,是因为MySQL当前会话的lc_time_names参数未设置为英文locale,导致STR_TO_DATE无法识别'Sep'、'Jul'这类英文月份缩写。

正确实现方式

1. 先设置会话时间区域为英文(单次执行即可)

SET lc_time_names = 'en_US';

2. 生成起始/结束日期

直接使用以下语句即可得到YYYY-MM-dd格式的日期结果:

-- 当月起始日期(YYYY-MM-dd)
DATE(STR_TO_DATE(delivery, '%b %Y')) AS startdate,
-- 当月结束日期(YYYY-MM-dd)
LAST_DAY(STR_TO_DATE(delivery, '%b %Y')) AS enddate

如果需要将结果以字符串类型返回(而非DATE类型),可以用DATE_FORMAT格式化:

DATE_FORMAT(STR_TO_DATE(delivery, '%b %Y'), '%Y-%m-%d') AS startdate,
DATE_FORMAT(LAST_DAY(STR_TO_DATE(delivery, '%b %Y')), '%Y-%m-%d') AS enddate

验证示例

针对字段值'Sep 2021',上述语句会返回:

  • startdate: 2021-09-01
  • enddate: 2021-09-30

无locale依赖的替代方案

如果无法修改会话参数,可使用月份映射的方式(效率略低,但无需设置locale):

-- 起始日期
STR_TO_DATE(
  CONCAT(
    ELT(FIELD(LEFT(delivery,3),'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'),1,2,3,4,5,6,7,8,9,10,11,12),
    '-01-',
    RIGHT(delivery,4)
  ),
  '%m-%d-%Y'
) AS startdate,
-- 结束日期
LAST_DAY(
  STR_TO_DATE(
    CONCAT(
      ELT(FIELD(LEFT(delivery,3),'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'),1,2,3,4,5,6,7,8,9,10,11,12),
      '-01-',
      RIGHT(delivery,4)
    ),
    '%m-%d-%Y'
  )
) AS enddate

优先推荐第一种设置locale的方案,更简洁高效。

内容的提问来源于stack exchange,提问作者Rassermann

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 10:54:58