SQL Server中如何生成'23 Apr, 2018 2:59 PM'格式的字符串?
解决方案:生成
23 Apr, 2018 2:59 PM格式的日期字符串 根据你的需求,我们可以分两种场景来实现,具体取决于你的SQL Server版本:
方法1:SQL Server 2012及以上版本(推荐)
从SQL Server 2012开始支持FORMAT函数,这是最简洁直观的方式,直接通过自定义格式字符串就能输出你想要的结果:
SELECT FORMAT(dbo.fn_GetDateIntime(cl.createdDate), 'd MMM, yyyy h:mm tt') AS FormattedDate FROM YourTable cl; -- 替换成你的实际表名
格式字符串各部分的作用:
d:1-2位的日期(无需前导零,比如3号显示3,23号显示23)MMM:月份的3字母缩写(如Apr、Jan)yyyy:4位完整年份h:1-2位的12小时制小时(无需前导零,比如2点显示2,10点显示10)mm:两位分钟(确保补零,比如9分显示09)tt:自动识别并显示AM/PM标识
方法2:SQL Server 2008及以下版本(不支持FORMAT函数)
如果你的版本比较旧,只能通过字符串拼接和日期函数组合来实现:
SELECT -- 拼接日期部分:dd MMM, yyyy CAST(DAY(dbo.fn_GetDateIntime(cl.createdDate)) AS VARCHAR(2)) + ' ' + LEFT(DATENAME(MONTH, dbo.fn_GetDateIntime(cl.createdDate)), 3) + ', ' + CAST(YEAR(dbo.fn_GetDateIntime(cl.createdDate)) AS VARCHAR(4)) -- 拼接时间部分:h:mm AM/PM + ' ' + CASE WHEN DATEPART(HOUR, dbo.fn_GetDateIntime(cl.createdDate)) > 12 THEN CAST(DATEPART(HOUR, dbo.fn_GetDateIntime(cl.createdDate)) - 12 AS VARCHAR(2)) WHEN DATEPART(HOUR, dbo.fn_GetDateIntime(cl.createdDate)) = 0 THEN '12' -- 处理午夜12点的情况 ELSE CAST(DATEPART(HOUR, dbo.fn_GetDateIntime(cl.createdDate)) AS VARCHAR(2)) END + ':' + RIGHT('0' + CAST(DATEPART(MINUTE, dbo.fn_GetDateIntime(cl.createdDate)) AS VARCHAR(2)), 2) + ' ' + CASE WHEN DATEPART(HOUR, dbo.fn_GetDateIntime(cl.createdDate)) >= 12 THEN 'PM' ELSE 'AM' END AS FormattedDate FROM YourTable cl; -- 替换成你的实际表名
关于你之前尝试的问题说明
你之前用CONVERT(CHAR(12), ..., 107)得到的是Apr 23, 2018,这是因为样式107的默认格式是Mon dd, yyyy(月在前、日在后),和你需要的dd Mon, yyyy顺序相反;而时间部分用CONVERT(VARCHAR(5), ..., 114)得到的是24小时制的hh:mm(比如14:59),没有AM/PM标识,所以不符合需求。
内容的提问来源于stack exchange,提问作者Sweetie
相关产品推荐
相关产品推荐

