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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:51:03