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的动态参数(比如允许用户手动选择截止日期,默认值为当月第一天),可以这么操作:
- 在SSRS报表中新建一个日期类型的参数,比如命名为
@CutoffDate - 给参数设置默认值:选择「指定值」,添加一个值并使用SSRS表达式编写:
=DateAdd(DateInterval.Day, 1, DateAdd(DateInterval.Month, -1, DateSerial(Year(Today()), Month(Today()), 1))) - 最后在数据集的查询中引用这个参数:
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
相关产品推荐
相关产品推荐

