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

如何为SQL Server存储过程传递可选日期或日期范围参数

可选日期范围存储过程实现方案

不需要编写CASE语句,沿用你已经熟悉的空值判断+OR逻辑即可实现三种场景的适配,逻辑清晰易维护。

首先将存储过程的两个日期参数都设置默认值为NULL:

CREATE PROCEDURE 你的存储过程名
    @PeriodFrom DATE = NULL,
    @PeriodTo DATE = NULL
AS
BEGIN
    -- 你的查询逻辑
    SELECT * FROM 你的表名
    WHERE
        -- 两个参数都不传:不限制日期
        (@PeriodFrom IS NULL AND @PeriodTo IS NULL)
        -- 仅传@PeriodFrom:精确匹配该日期(和你之前的单参数逻辑保持一致)
        OR (@PeriodFrom IS NOT NULL AND @PeriodTo IS NULL AND Period = @PeriodFrom)
        -- 仅传@PeriodTo:精确匹配该日期
        OR (@PeriodFrom IS NULL AND @PeriodTo IS NOT NULL AND Period = @PeriodTo)
        -- 两个参数都传:匹配日期范围
        OR (Period BETWEEN @PeriodFrom AND @PeriodTo)
    -- 可选:大数据量场景下添加,解决OR逻辑导致的索引失效/参数嗅探问题
    OPTION (RECOMPILE)
END

如果你希望仅传单个参数时是半开区间筛选(比如只传开始日期就查所有大于等于该日期的记录),只需要调整中间两个判断条件即可:

WHERE
    (@PeriodFrom IS NULL AND @PeriodTo IS NULL)
    OR (@PeriodFrom IS NOT NULL AND @PeriodTo IS NULL AND Period >= @PeriodFrom)
    OR (@PeriodFrom IS NULL AND @PeriodTo IS NOT NULL AND Period <= @PeriodTo)
    OR (Period BETWEEN @PeriodFrom AND @PeriodTo)

注意事项

  • 如果你的Period字段是带时分秒的DATETIME/DATETIME2类型,不要用BETWEEN,会漏掉结束日期当天0点之后的记录,建议修改为Period >= @PeriodFrom AND Period < DATEADD(DAY, 1, @PeriodTo)
  • 数据量小的场景可以不加OPTION (RECOMPILE),对性能影响可以忽略

内容的提问来源于stack exchange,提问作者Brian Battles

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 12:24:04