适配MariaDB的SQL语句中CONVERT()函数改写方案咨询
解决SQL Anywhere到MariaDB的CONVERT语句迁移问题
首先,先搞清楚你提到的参数100是什么意思:
在SQL Anywhere中,CONVERT()函数的第三个参数是日期/时间格式代码,100对应的是带AM/PM的美式日期时间格式,输出样式类似:Oct 15 2024 9:30AM。
接下来解释你遇到的报错原因:
MariaDB的CONVERT()语法确实只支持两个参数(值 + 目标数据类型),它只能做数据类型转换,不支持像SQL Anywhere那样通过第三个参数指定日期格式。你尝试的CONVERT((a.time_started, 100), CHAR)写法不符合MariaDB的语法规范,所以会报错。
正确的MariaDB写法
要实现和原语句相同的效果,你需要用MariaDB的DATE_FORMAT()函数来指定日期格式(因为它专门负责日期时间的格式化输出),然后如果需要转成CHAR类型,直接用CONVERT()包裹即可(不过DATE_FORMAT()本身返回的就是字符串,所以也可以省略CONVERT()):
推荐写法(直接格式化):
DATE_FORMAT(a.time_started, '%b %d %Y %h:%i%p') AS 'Waiting Since'
带CONVERT的写法(如果需要明确转CHAR类型):
CONVERT(DATE_FORMAT(a.time_started, '%b %d %Y %h:%i%p'), CHAR) AS 'Waiting Since'
格式符对应说明
这里的%b %d %Y %h:%i%p完全对应SQL Anywhere中100的格式:
%b:缩写月份名称(如Jan、Oct)%d:两位数字的日期(01-31)%Y:四位数字的年份%h:12小时制的小时(01-12)%i:两位数字的分钟(00-59)%p:大写的AM/PM标识
内容的提问来源于stack exchange,提问作者Muirik




