如何将日期截断为仅年月维度且保持日期类型,不转为varchar/char等字符串类型
解决方案
要实现保留年月维度且保持date类型的需求,不能使用FORMAT这类返回字符串的函数,核心思路是将日期截断到当月1号,用原生日期运算生成合法的date类型值,完全避免字符串转换的问题。
SQL Server 方案(适配你当前使用的数据库)
全版本通用写法
使用DATEFROMPARTS函数直接拼接年月、固定日为1,返回原生date类型:
DATEFROMPARTS(YEAR(你的日期列), MONTH(你的日期列), 1)
你的场景下的赋值写法示例:
DECLARE @FirstCompletion DATE -- 直接将截断后的日期赋值给date类型变量 SELECT @FirstCompletion = DATEFROMPARTS(YEAR(A.completeddate), MONTH(A.completeddate), 1) FROM 你的表名 A WHERE 你的筛选条件 -- 后续日期运算完全正常,无需额外转换 DECLARE @secondMonth DATE SET @secondMonth = DATEADD(MONTH, 2, @FirstCompletion)
SQL Server 2022 及以上版本简化写法
可以直接使用DATETRUNC函数按月份粒度截断日期:
DATETRUNC(MONTH, 你的日期列)
其他常见数据库适配方案
- MySQL 8.0及以上:
DATETRUNC(MONTH, 你的日期列) - MySQL 低版本:
STR_TO_DATE(CONCAT(YEAR(你的日期列), '-', MONTH(你的日期列), '-01'), '%Y-%m-%d') - PostgreSQL:
DATE_TRUNC('month', 你的日期列)::DATE
原方案报错原因说明
FORMAT函数返回值为字符串类型,直接赋值给date类型变量时需要数据库隐式转换,一旦字符串格式和数据库默认的日期解析规则不匹配,就会抛出转换失败的错误,原生日期运算的方案完全规避了这个问题。
内容的提问来源于stack exchange,提问作者Dman
相关产品推荐
相关产品推荐

