如何在SQL中将'2016-06-10 09:30:04.000'转换为'06/10/2016 9:30 AM'
不同SQL数据库的时间格式转换方案
刚好处理过类似的需求,不同SQL数据库的日期格式化函数各有不同,我给你列几个主流数据库的实现方法,直接就能套用:
SQL Server 实现
你可以用FORMAT函数(SQL Server 2012及以上版本支持),语法简洁直观:
SELECT FORMAT(CAST('2016-06-10 09:30:04.000' AS DATETIME), 'MM/dd/yyyy h:mm tt') AS FormattedTime;
如果你的版本不支持FORMAT,可以用CONVERT结合字符串拼接来实现:
SELECT CONVERT(VARCHAR, CAST('2016-06-10 09:30:04.000' AS DATETIME), 101) + ' ' + LTRIM(RIGHT(CONVERT(VARCHAR, CAST('2016-06-10 09:30:04.000' AS DATETIME), 100), 7)) AS FormattedTime;
101格式码对应MM/dd/yyyy的日期格式100格式码会返回Mon dd yyyy hh:miAM,取右边7位就能得到带AM/PM的时间部分,再用LTRIM去掉前导空格
MySQL 实现
用DATE_FORMAT函数就能直接完成转换:
SELECT DATE_FORMAT('2016-06-10 09:30:04.000', '%m/%d/%Y %l:%i %p') AS FormattedTime;
格式符说明:
%m:两位数字的月份(01-12)%d:两位数字的日期(01-31)%Y:四位数字的年份%l:12小时制的小时(不带前导零,1-12)%i:两位数字的分钟(00-59)%p:显示AM或PM(大写)
Oracle 实现
通过TO_CHAR函数配合日期格式模型实现:
SELECT TO_CHAR(TO_DATE('2016-06-10 09:30:04.000', 'YYYY-MM-DD HH24:MI:SS.FF3'), 'MM/DD/YYYY HH:MI AM') AS FormattedTime FROM DUAL;
- 先通过
TO_DATE把字符串转成Oracle的日期类型(如果字段本身是日期类型,这一步可以省略) MM/DD/YYYY对应目标日期格式,HH:MI AM对应12小时制的时间和上午/下午标识
注意事项
- 如果你的时间数据本身是日期/时间类型(不是字符串),可以直接替换示例中的字符串为字段名,不需要额外转换
- 部分数据库对格式符的大小写敏感,比如Oracle的
AM如果写成am会显示小写的上午/下午标识
内容的提问来源于stack exchange,提问作者Muthukrishnan Kandasamy




