如何在SQL存储过程中将传入日期参数强制转换为当月第一天
存储过程日期参数自动转换为当月首日的实现方案
核心转换逻辑
SQL Server中可通过以下两种常用方式将任意日期转换为对应月份的第一天:
- 全版本兼容写法:
DATEADD(month, DATEDIFF(month, 0, 待转换日期), 0)
计算逻辑:先计算待转换日期与初始日期1900-01-01的间隔月份数,再将该间隔数加回到初始日期上,即可得到当月第一天。 - SQL Server 2022及更高版本简化写法:
DATEFROMPARTS(YEAR(待转换日期), MONTH(待转换日期), 1)
直接通过年月日拼接的方式生成当月首日,可读性更强。
存储过程修改方案
你可以选择在插入逻辑前先预处理参数,或者直接在INSERT语句中转换值,以下是预处理参数的完整修改代码,逻辑更清晰易维护:
ALTER PROCEDURE [dbo].[usp_CR_PW_Insert] ( @PR_STATUS int = NULL ,@CASE_TYPE int = NULL ,@FROM_DATE date = NULL ,@TO_DATE date = NULL ) AS BEGIN -- 预处理日期参数,转换为当月第一天 SET @FROM_DATE = DATEADD(month, DATEDIFF(month, 0, @FROM_DATE), 0) SET @TO_DATE = DATEADD(month, DATEDIFF(month, 0, @TO_DATE), 0) BEGIN TRY BEGIN TRANSACTION; INSERT into [dbo].[tbl_CR_Premium] ( PR_STATUS ,CASE_TYPE ,FROM_DATE ,TO_DATE ) VALUES ( @PR_STATUS ,@CASE_TYPE ,@FROM_DATE ,@TO_DATE ); COMMIT TRANSACTION; END TRY BEGIN CATCH BEGIN PRINT N'The transaction is in an uncommittable state.' + 'Rolling back transaction.' ROLLBACK TRANSACTION; END; END CATCH; END GO
如果仅需要转换@FROM_DATE、不需要转换@TO_DATE,删除对应@TO_DATE的预处理语句即可。
效果验证
当传入@FROM_DATE = '4/8/2021'时,预处理后的值会自动变为4/1/2021,完全符合业务需求。
内容的提问来源于stack exchange,提问作者Johnny Bones
相关产品推荐
相关产品推荐

