SQL里那些时间维度的转换琐碎事儿,主要讲怎么把时间格式变来变去,挺实用的
- 问答
- 2025-12-26 12:11:06
- 1
综合自日常数据库开发中的常见问题及解决方案,参考了如CSDN技术博客、Stack Overflow社区问答以及MySQL、PostgreSQL等官方文档的常用部分,但以口语化方式表达)
在弄数据库的时候,跟时间打交道是家常便饭,但你肯定会遇到这种烦心事儿:数据库里存的时间格式五花八门,有时候是‘2023-10-27 15:30:00’这样完整的,有时候又只存了个年月‘202310’,或者是一个你完全看不懂的时间戳数字,等到你要做报表、查数据或者把数据倒来倒去的时候,就傻眼了,因为格式对不上,学会把时间变来变去,是SQL里非常实用的一项基本功。
咱们先从一个最最常见的场景开始说,你从数据库里查出一个完整的日期时间,2023-10-27 15:30:45’,但你的领导或者业务方只需要看‘年-月’的部分,2023-10’,用来做月度汇总,这时候该怎么办?
在不同的数据库里,方法不太一样,但思路差不多,比如在MySQL里,你可以用 DATE_FORMAT 这个函数,你告诉它你要处理哪个时间字段,再告诉它你想要的样子,写起来大概是这样的:SELECT DATE_FORMAT(your_date_column, '%Y-%m') FROM your_table;,这里的 %Y 代表四位数的年,%m 代表两位数的月,你要是想变成‘10/27/2023’这种格式,就用 DATE_FORMAT(your_date_column, '%m/%d/%Y')。
要是在PostgreSQL里,用的函数是 TO_CHAR,用法也很像:SELECT TO_CHAR(your_timestamp_column, 'YYYY-MM') FROM your_table;,你会发现,它只是函数名和格式的写法稍微有点区别。
反过来,另一种头疼的情况是,你手里只有一串数字或者一个不标准的字符串,想把它变成数据库能认的真正的时间类型,这样才能进行加减、比较这些高级操作,比如说,你拿到一个字符串‘20231027’,想把它变成日期。
在MySQL里,可以用 STR_TO_DATE 函数,你得像配钥匙一样,告诉它字符串长什么样:SELECT STR_TO_DATE('20231027', '%Y%m%d'); 这样一弄,数据库就明白了,哦,这是年月日连在一起的,然后它就会返回一个标准的日期值,如果字符串是‘2023-10-27’,格式符就得写成‘%Y-%m-%d’。
PostgreSQL里更直接一点,它有强大的 CAST 函数,或者直接用两个冒号 来转换。SELECT '2023-10-27'::date; 就能直接转成日期类型,对于非标准格式,也可以用 TO_DATE,跟MySQL的STR_TO_DATE类似,SELECT TO_DATE('20231027', 'YYYYMMDD');。

还有一种经常碰到的是时间戳(timestamp)的转换,有时候系统里存的是从‘1970-01-01’开始算起的秒数或毫秒数,就是一长串数字,这东西人眼根本看不懂,必须转换。
在MySQL里,可以用 FROM_UNIXTIME 函数。SELECT FROM_UNIXTIME(1698413445); 就会把它转换成‘2023-10-27 07:30:45’这样的本地时间,如果你的时间戳是毫秒级的(13位数),就需要先除以1000:FROM_UNIXTIME(1698413445000 / 1000)。
PostgreSQL里,处理秒级时间戳可以用 TO_TIMESTAMP 函数:SELECT TO_TIMESTAMP(1698413445); 它返回的是带时区的时间戳类型。
除了这些格式的变来变去,时间的加减也是常事,我想查昨天、上周、或者下个月的数据,这就需要用日期加减函数。

MySQL里用的是 DATE_ADD 和 DATE_SUB,找当前时间一天后的时间:SELECT DATE_ADD(NOW(), INTERVAL 1 DAY); 找一个月前的:SELECT DATE_SUB(NOW(), INTERVAL 1 MONTH);,这个 INTERVAL 关键字很好用,可以灵活地换成年、季度、月、日、小时、分钟。
PostgreSQL里写法更简洁一些,直接用加减号,比如当前时间加一天:SELECT NOW() + INTERVAL '1 day'; 减一个月:SELECT NOW() - INTERVAL '1 month';,注意这里的间隔单位是用单引号引起来的。
再提一个提取时间特定部分的技巧,有时候你不需要改变格式,只是想单独拿出小时、星期几这样的信息,这时候可以用提取函数。
MySQL的 EXTRACT 函数:SELECT EXTRACT(HOUR FROM '2023-10-27 15:30:45') 会返回15。EXTRACT(MONTH FROM ...) 返回月份。
PostgreSQL也有同名的 EXTRACT 函数,用法几乎一样。
SQL里处理时间格式转换,核心就是几个关键函数:格式化输出(DATE_FORMAT/TO_CHAR)、字符串/数字转日期(STR_TO_DATE/TO_DATE/CAST)、时间戳转换(FROM_UNIXTIME/TO_TIMESTAMP)、日期加减(DATE_ADD/DATE_SUB或±INTERVAL)以及提取部分内容(EXTRACT),虽然不同数据库的函数名和语法稍有差异,但背后的逻辑是相通的,最实用的建议就是,当你遇到时间格式问题的时候,先别慌,搞清楚你现在手里有的格式是什么(源格式),想要变成什么格式(目标格式),然后根据你用的数据库类型,去查对应的这几个核心函数,八成都能找到解决办法,多练几次,这些转换就成了你的肌肉记忆,一点都不琐碎了。
本文由寇乐童于2025-12-26发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://haoid.cn/wenda/68778.html
