SQL Server用CONVERT(style113)实现印尼语日期转换(禁用FORMAT)
解决SQL Server不用FORMAT函数实现印尼语日期格式(style113本地化)
这个问题我之前也碰到过——SQL Server的CONVERT函数用style 113时,月份缩写是固定的英文格式,没法直接切换到印尼语,而且又被限制不能用FORMAT函数。没关系,我们可以用两种可靠的方法来实现需求:
方法一:字符串替换法
这种方法最简单直接,先利用CONVERT(style=113)得到基础的日期字符串,再把和印尼语不一致的月份缩写替换掉就行。
印尼语和英文月份缩写的差异只有4组:
- Aug → Agt(8月)
- May → Mei(5月)
- Oct → Okt(10月)
- Dec → Des(12月)
其他月份的缩写两者是一致的,所以只需要替换这4个即可:
DECLARE @TargetDateTime DATETIME = '2018-08-05 18:21:35.743' SELECT REPLACE(REPLACE(REPLACE(REPLACE( CONVERT(VARCHAR(30), @TargetDateTime, 113), 'Aug', 'Agt'), 'May', 'Mei'), 'Oct', 'Okt'), 'Dec', 'Des') AS Indonesian_Formatted_Date
优点:代码简洁,快速实现;缺点:依赖CONVERT返回的英文月份缩写格式,虽然SQL Server的这个格式几乎不会变,但灵活性稍差。
方法二:拆分拼接法
这种方法逻辑更清晰,把日期拆分成各个独立部分(日、月、年、时分秒、毫秒),分别处理后再拼接成目标格式,完全可控,不会依赖系统的默认缩写。
DECLARE @TargetDateTime DATETIME = '2018-08-05 18:21:35.743' SELECT -- 处理日:补前导零确保两位数字 RIGHT('0' + CAST(DAY(@TargetDateTime) AS VARCHAR(2)), 2) + ' ' + -- 直接指定印尼语月份缩写 CASE MONTH(@TargetDateTime) WHEN 1 THEN 'Jan' WHEN 2 THEN 'Feb' WHEN 3 THEN 'Mar' WHEN 4 THEN 'Apr' WHEN 5 THEN 'Mei' WHEN 6 THEN 'Jun' WHEN 7 THEN 'Jul' WHEN 8 THEN 'Agt' WHEN 9 THEN 'Sep' WHEN 10 THEN 'Okt' WHEN 11 THEN 'Nov' WHEN 12 THEN 'Des' END + ' ' + -- 处理年 CAST(YEAR(@TargetDateTime) AS VARCHAR(4)) + ' ' + -- 处理时分秒:用style=108直接获取标准格式 CONVERT(VARCHAR(8), @TargetDateTime, 108) + ':' + -- 处理毫秒:补前导零确保三位数字 RIGHT('00' + CAST(DATEPART(MILLISECOND, @TargetDateTime) AS VARCHAR(3)), 3) AS Indonesian_Formatted_Date
优点:完全自定义每个部分的输出,可靠性高,后续如果要调整其他语言格式也很方便;缺点:代码长度比替换法稍长。
两种方法测试后,都会输出你期望的结果:05 Agt 2018 18:21:35:743,你可以根据自己的实际场景选择合适的方案。
内容的提问来源于stack exchange,提问作者hehehe
相关产品推荐
相关产品推荐

