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

SQL Server技术问询:如何获取当前月第一天之前的所有记录?

使用EOMONTH实现SQL Server筛选早于当月第一天的记录(适配SSRS参数)

当然可以借助EOMONTH函数来实现你的需求,而且这种方法简洁又可靠,完全不需要依赖静态值,刚好适配SSRS的动态参数场景。

核心逻辑:动态获取当月第一天

要筛选早于当前月份第一天的记录,首先得算出动态的当月第一天日期。用EOMONTH的话,可以这么写:

DATEADD(DAY, 1, EOMONTH(GETDATE(), -1))

拆解下这个表达式的含义:

  • EOMONTH(GETDATE(), -1):返回上个月的最后一天(比如当前是2024年6月,就返回2024-05-31)
  • 给这个日期加1天,就能得到当前月份的第一天(2024-06-01)

直接用于SQL筛选的示例

把这个表达式直接放到WHERE子句里,就能筛选出所有CREATEDDATETIME早于当月第一天的记录:

SELECT *
FROM YourTargetTable
WHERE CREATEDDATETIME < DATEADD(DAY, 1, EOMONTH(GETDATE(), -1))

适配SSRS参数的设置

如果要把这个条件做成SSRS的动态参数(比如允许用户手动选择截止日期,默认值为当月第一天),可以这么操作:

  1. 在SSRS报表中新建一个日期类型的参数,比如命名为@CutoffDate
  2. 给参数设置默认值:选择「指定值」,添加一个值并使用SSRS表达式编写:
    =DateAdd(DateInterval.Day, 1, DateAdd(DateInterval.Month, -1, DateSerial(Year(Today()), Month(Today()), 1)))
    
  3. 最后在数据集的查询中引用这个参数:
    SELECT *
    FROM YourTargetTable
    WHERE CREATEDDATETIME < @CutoffDate
    

额外补充:兼容旧版SQL Server的替代方案

如果你的SQL Server版本低于2012(EOMONTH是2012及以上版本支持的函数),也可以用这个写法获取当月第一天:

DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1)

对应的筛选条件就是:

WHERE CREATEDDATETIME < DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1)

内容的提问来源于stack exchange,提问作者Jordan Howard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:29:47