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

如何在SQL Server中仅更新日期字段的日部分为指定值

如何修改日期列的日部分为特定值(保留年月)

嘿,这个需求我经常碰到,刚好可以分几种常用的数据库场景给你讲清楚怎么实现,毕竟不同SQL方言处理日期的函数差异还挺大的~

先再明确下你的需求:把表中RegisterDate列的所有日期的「日」改成指定值(比如示例里的02),年和月保持不变。原数据和期望结果如下:

原表数据

id | RegisterDate
---|-------------
1  | 2001-01-18
2  | 2018-09-13
3  | 1999-04-28
4  | 2012-12-15

期望结果

id | RegisterDate
---|-------------
1  | 2001-01-02
2  | 2018-09-02
3  | 1999-04-02
4  | 2012-12-02

下面是不同数据库的具体实现方法:


1. MySQL/MariaDB

可以通过DATE_FORMAT提取年月部分,拼接上目标日,再用STR_TO_DATE转成日期格式:

UPDATE your_table
SET RegisterDate = STR_TO_DATE(CONCAT(DATE_FORMAT(RegisterDate, '%Y-%m-'), '02'), '%Y-%m-%d');

或者更简洁的方式,用MAKEDATE和日期偏移:

UPDATE your_table
SET RegisterDate = MAKEDATE(YEAR(RegisterDate), 1) + INTERVAL (MONTH(RegisterDate)-1) MONTH + INTERVAL 1 DAY;

(这里INTERVAL 1 DAY是因为当月第一天加1天就是第二天,对应目标日02)


2. SQL Server

SQL Server的DATEFROMPARTS函数非常适合这个场景,直接提取年、月,加上目标日生成新日期:

UPDATE your_table
SET RegisterDate = DATEFROMPARTS(YEAR(RegisterDate), MONTH(RegisterDate), 2);

3. PostgreSQL

可以用TO_CHAR提取年月字符串,拼接目标日后再转成日期;或者用DATE_TRUNC截断到月份后加偏移:
方法一:字符串拼接转日期

UPDATE your_table
SET RegisterDate = TO_DATE(TO_CHAR(RegisterDate, 'YYYY-MM') || '-02', 'YYYY-MM-DD');

方法二:日期截断加偏移

UPDATE your_table
SET RegisterDate = DATE_TRUNC('month', RegisterDate) + INTERVAL '1 day';

(同样,截断到月份得到当月第一天,加1天就是02号)


注意事项

如果你的目标日是31号,要注意像4、6、9、11月这类没有31天的月份,不同数据库的处理逻辑不一样:比如SQL Server会报错,MySQL会自动调整到该月的最后一天。所以如果目标日是大数值,建议先验证业务场景是否允许这种自动调整,或者提前过滤异常日期。

内容的提问来源于stack exchange,提问作者Morteza Jangjoo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:45:32