You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将日期截断为仅年月维度且保持日期类型,不转为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 20:54:05