如何将Date Time转换为非空SmallDatetime并格式化为01 MMM yyyy?
解决方案:DateTime转非空SmallDatetime并格式化指定格式
首先明确两个核心点:
CAST(T0.RefDate AS SMALLDATETIME)仅负责转换数据类型,不会改变日期的显示格式——你看到的2023-12-31 00:00:00是数据库客户端的默认日期显示样式,并非转换操作导致的问题。- 要得到
31 DEC 2022这种字符串格式,需要在转换数据类型后,再通过字符串格式化函数处理。
1. 确保转换为非空SmallDatetime
如果原DateTime字段可能为空,先通过ISNULL或COALESCE处理非空约束,再转换类型:
-- 用ISNULL指定默认值(示例为当前日期),确保结果非空 CAST(ISNULL(T0.RefDate, GETDATE()) AS SMALLDATETIME)
注意:SmallDatetime的合法范围是1900-01-01 00:00:00到2079-06-06 23:59:00,如果原DateTime值超出此范围,转换会报错,需提前校验。
2. 格式化为dd MMM yyyy字符串
以SQL Server为例,提供两种常用实现方式:
方式一:FORMAT函数(语法直观)
FORMAT(CAST(ISNULL(T0.RefDate, GETDATE()) AS SMALLDATETIME), 'dd MMM yyyy', 'en-US')
第三个参数'en-US'确保月份缩写为英文形式(如DEC),若数据库默认语言为英文,可省略该参数。
方式二:CONVERT函数(性能更优)
-- 先设置会话语言为英文,保证月份缩写正确 SET LANGUAGE English; -- 用样式106对应dd MMM yyyy格式 CONVERT(VARCHAR(11), CAST(ISNULL(T0.RefDate, GETDATE()) AS SMALLDATETIME), 106)
若需要大写的月份缩写,可嵌套UPPER()函数:
UPPER(CONVERT(VARCHAR(11), CAST(ISNULL(T0.RefDate, GETDATE()) AS SMALLDATETIME), 106))
最终完整示例
合并转换与格式化逻辑,直接得到31 DEC 2022格式结果:
UPPER(FORMAT(CAST(ISNULL(T0.RefDate, GETDATE()) AS SMALLDATETIME), 'dd MMM yyyy', 'en-US'))
内容的提问来源于stack exchange,提问作者Tichaona Jermaine Gaza
相关产品推荐
相关产品推荐

