T-SQL如何将NVARCHAR日期值转换为mm/dd/yyyy hh:mmAM/PM格式
T-SQL 实现指定日期格式转换方案
针对需要将nvarchar类型存储的日期转换为MM/dd/yyyy hh:mmtt(即06/01/2022 12:00AM格式)的需求,可根据使用的SQL Server版本选择对应实现方式:
方案1:SQL Server 2012及以上版本(推荐)
直接使用FORMAT函数自定义输出格式,写法最简洁,结果完全匹配要求:
DECLARE @d NVARCHAR(255) = '2022-06-01' SELECT FORMAT(CAST(@d AS DATETIME), 'MM/dd/yyyy hh:mmtt') AS FormattedDate
执行返回结果:06/01/2022 12:00AM,满足4位年份、无秒数、12小时制带AM/PM标识、月/日/年排序的全部要求。
方案2:SQL Server 2008 R2及更早版本(无FORMAT函数兼容方案)
通过日期函数拆分各部分字段后拼接,完全不依赖内置CONVERT样式编号,可控性更高:
DECLARE @d NVARCHAR(255) = '2022-06-01' DECLARE @dt DATETIME = CAST(@d AS DATETIME) SELECT CONCAT( RIGHT('0' + CAST(MONTH(@dt) AS VARCHAR(2)),2), -- 两位月份,不足前补0 '/', RIGHT('0' + CAST(DAY(@dt) AS VARCHAR(2)),2), -- 两位日期,不足前补0 '/', YEAR(@dt), -- 四位年份 ' ', RIGHT('0' + CAST(((DATEPART(HOUR,@dt) + 11) % 12 ) + 1 AS VARCHAR(2)),2), -- 12小时制小时,不足前补0 ':', RIGHT('0' + CAST(DATEPART(MINUTE,@dt) AS VARCHAR(2)),2), -- 两位分钟,不足前补0 CASE WHEN DATEPART(HOUR,@dt) < 12 THEN 'AM' ELSE 'PM' END -- 上下午标识 ) AS FormattedDate
注意事项
- 现有T-SQL内置的CONVERT样式编号没有完全匹配需求的选项,要么输出2位年份,要么强制带秒数,不建议通过字符串替换内置样式输出的方式实现,容易出现边界问题。
- 由于审计列是多类型数据混存的nvarchar字段,生产环境使用时建议替换
CAST为TRY_CAST做容错,遇到非日期格式的内容会返回NULL,不会导致整个查询报错。
内容的提问来源于stack exchange,提问作者Melinda
相关产品推荐
相关产品推荐

