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

如何从DD-MMM-YY格式的字符串日期列中获取最小日期

解决字符串日期取最小日期错误的问题

哈哈,这个坑我踩过!问题出在你把日期存在字符串列里,数据库比较字符串是按字符逐个顺序来的,不是按实际日期逻辑判断的。比如01-Dec-22的第一个字符是0,比28-Aug-22的2小,数据库就误以为它更早,但实际上8月(Aug)可比12月(Dec)早多了对吧?

核心解决思路

先把字符串格式的日期转换成真正的日期类型,再用MIN()函数计算最小值,要是需要输出原来的DD-MMM-YY格式,再转回去就行。下面分几种常用数据库给你具体代码:

MySQL/MariaDB

用STR_TO_DATE()把字符串转成日期,再取最小值:

SELECT MIN(STR_TO_DATE(file_date, '%d-%b-%y')) AS earliest_date
FROM tablename;

如果要保持输出格式和原列一致,套一层DATE_FORMAT():

SELECT DATE_FORMAT(MIN(STR_TO_DATE(file_date, '%d-%b-%y')), '%d-%b-%y') AS earliest_date
FROM tablename;

注意:%b对应英文月份缩写(比如Aug、Dec),要确保你的数据库环境是英文月份,不然得调整格式符。

PostgreSQL

用TO_DATE()函数转换:

SELECT MIN(TO_DATE(file_date, 'DD-Mon-YY')) AS earliest_date
FROM tablename;

转回原格式用TO_CHAR():

SELECT TO_CHAR(MIN(TO_DATE(file_date, 'DD-Mon-YY')), 'DD-Mon-YY') AS earliest_date
FROM tablename;

SQL Server

推荐用TRY_CONVERT()(避免转换失败报错),其中6是对应DD-Mon-YY格式的样式代码:

SELECT MIN(TRY_CONVERT(DATE, file_date, 6)) AS earliest_date
FROM tablename;

转回原格式用FORMAT():

SELECT FORMAT(MIN(TRY_CONVERT(DATE, file_date, 6)), 'dd-MMM-yy') AS earliest_date
FROM tablename;

长远优化建议

最好直接修改表结构,把file_date列改成日期类型(比如DATE、DATETIME),这样后续所有日期相关的查询、排序、计算都会准确,再也不会踩字符串比较的坑。这里给你不同数据库的修改语句(操作前记得备份数据!):

-- MySQL
ALTER TABLE tablename MODIFY COLUMN file_date DATE;

-- PostgreSQL
ALTER TABLE tablename ALTER COLUMN file_date TYPE DATE USING TO_DATE(file_date, 'DD-Mon-YY');

-- SQL Server
ALTER TABLE tablename ALTER COLUMN file_date DATE;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 17:40:16