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

SQL Server存储过程每日执行仅保留月末历史表修改方案

解决方案:修改存储过程以仅保留每月最后一天的历史数据

要实现每日执行存储过程,但仅保留每月最后一天的历史数据,我们可以通过判断当前日期是否为当月最后一天,再配合历史数据的清理逻辑来完成。以下是具体的修改步骤和代码示例:


1. 添加当月最后一天的判断逻辑

首先在你的存储过程开头,添加判断当前日期是否为当月最后一天的变量:

DECLARE @today AS DATE = CAST(GETDATE() AS DATE)
-- 判断是否为当月最后一天(SQL Server 2012+ 可用EOMONTH,更早版本用下方替代逻辑)
DECLARE @isLastDayOfMonth BIT = CASE WHEN EOMONTH(@today) = @today THEN 1 ELSE 0 END

-- 兼容SQL Server 2008及更早版本的判断逻辑(如果需要):
-- DECLARE @isLastDayOfMonth BIT = CASE WHEN DATEADD(DAY, 1, @today) = DATEADD(MONTH, DATEDIFF(MONTH, 0, @today) + 1, 0) THEN 1 ELSE 0 END

2. 清理非必要的历史数据

根据是否为当月最后一天,我们需要清理历史表中的冗余数据:

  • 如果不是当月最后一天:删除当前月份所有已存在的记录(因为我们只需要保留当月最后一天的版本,中间日期的记录可以覆盖)
  • 如果是当月最后一天:仅删除当前月份中除今天以外的记录(确保当月只保留最后一天的版本,避免多次执行重复插入)

假设你的历史表中有一个存储执行日期的列(比如RunDate,需替换为你表中的实际列名),代码如下:

-- 清理当前月份的冗余历史数据
IF @isLastDayOfMonth = 0
BEGIN
    -- 非最后一天:清空当月所有记录,准备插入今日数据
    DELETE FROM [CI_Temp].[dbo].[Items_Scored_With_History]
    WHERE DATEPART(YEAR, RunDate) = DATEPART(YEAR, @today)
      AND DATEPART(MONTH, RunDate) = DATEPART(MONTH, @today)
END
ELSE
BEGIN
    -- 最后一天:只保留今日的记录,删除当月其他日期的记录
    DELETE FROM [CI_Temp].[dbo].[Items_Scored_With_History]
    WHERE DATEPART(YEAR, RunDate) = DATEPART(YEAR, @today)
      AND DATEPART(MONTH, RunDate) = DATEPART(MONTH, @today)
      AND RunDate <> @today
END

3. 执行原有数据生成逻辑

完成清理后,继续执行你原来的存储过程逻辑(生成数据并插入到Items_Scored_With_History表中)。比如如果原来的逻辑是插入今日的计算结果,现在可以正常执行:

-- 这里放入你原来的生成数据并插入表的代码
-- 示例:INSERT INTO [CI_Temp].[dbo].[Items_Scored_With_History] (RunDate, ...) VALUES (@today, ...)

逻辑说明

  • 每日执行时,非月末日期会自动替换当月的历史记录,确保只有最新的中间数据,但不会保留这些中间版本
  • 月末当天执行时,会保留当月最后一天的记录,同时清理当月其他日期的冗余数据
  • 所有历史月份的最后一天记录会被永久保留,不会被清理

内容的提问来源于stack exchange,提问作者James Taylor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:52:11