SQL Server实现查询‘提前一天’的数据

本文介绍如何使用SQL Server的DateDiff函数实现查询数据,通过实例演示如何标记'提前一天'和'提前两天'的时间,适合初学者理解时间戳操作。

学习目标:SQL Server实现查询‘提前一天’的数据

提示:使用前景

当我们需要对某些数据进行查询或者标记的时候,数据的时间被设定为提前一天即可使用一下的sql语句查询。


学习内容:

在这里我们需要使用到 DateDiff(a,b,c)函数方法,具体大家可以自行百度如何使用该方法。
下面就是我们要查询的SQL了

SELECT id,time,	neerworktime,(CASE WHEN DateDiff(d,time,getDate())<1 AND DateDiff(d,getDate(),time)=1 THEN 'true' END ) AS neerworktime
		FROM Orders
		WHERE state=0;

提示:由于写这篇文章的日期是:2022-04-23,所以这里可以看到24号的时间是被我们成功备注为'true'
在这里插入图片描述

同理,如果需要查询提前两天的话只需要按照一下修改即可。至于其他的时间欢迎大家自己去尝试我就不再过多说明了。

 DateDiff(d,time,getDate())<2 AND DateDiff(d,getDate(),time)=2

<think>嗯,用户问的是SQL Server中执行删除数据操作的时机。这个问题涉及到数据库操作的内部机制和外部触发条件,需要从多个层面来分析。 用户可能正在处理数据库性能优化或事务控制相关的工作,比如遇到了删除操作延迟的问题,或者想设计高效的数据清理策略。从问题表述看,用户对数据库有一定基础,但需要更系统的时机分析。 参考提供的引用材料,[引用3]提到了死锁场景下的删除操作阻塞情况,[引用1]则强调了批量删除的优化价值。这些都很关键,但还需要补充更全面的触发机制分析。 首先想到的是用户触发的直接删除操作,这是最显性的时机。当执行DELETE语句或TRIGGER中的删除逻辑时(如[引用5]提到的触发器类型),SQL Server会立即处理。但要注意,有事务包裹时实际删除可能延迟到COMMIT。 自动维护任务这个点很重要。根据[引用1]的"清理无用数据"建议,SQL Server Agent的定期作业是很典型的场景。比如每天凌晨执行的归档脚本,这种时机对用户透明但影响显著。 锁机制导致的延迟是难点。[引用3]展示的死锁案例说明,当删除操作需要获取被其他事务占用的锁时,会进入等待状态。这里需要解释锁等待超时(SET LOCK_TIMEOUT)和死监测机制。 后台进程方面,想到日志写入器和检查点线程。删除操作产生的日志会先到日志缓冲区,由日志写入器异步刷盘;脏页则通过检查点持久化。这些内部流程会影响删除的物理落盘时机。 内存压力下的惰性删除也值得说明。特别是当缓冲池需要空间时,可能提前清除已删除但未刷盘的脏页,这与[引用4]的执行计划缓存机制有相似的内存管理逻辑。 最后是索引维护的联动影响。删除数据会标记索引条目为幽灵记录,后台线程才会真正清理。这与[引用1]提到的"清理数据库碎片"直接相关,可以形成呼应。 用户可能最关心如何控制删除时机,所以优化建议部分要具体。比如在低峰期执行批量删除、合理设置事务隔离级别、监控锁竞争等。引用材料中的分批处理([引用1])和死锁处理([引用3])都是很好的佐证。 需要提醒用户注意,系统表的删除(如统计信息更新)容易被忽视。这部分可以结合[引用4]的执行计划生成机制,说明自动维护任务触发的删除。 整体采用分层表述:先说用户主动触发场景,再展开系统自动触发的各类情形,最后给优化建议。技术细节如幽灵记录清理、检查点机制要解释清楚但避免冗长。 </think> 在 SQL Server 中,数据删除操作的实际执行时机取决于多个因素,并非简单的“立即执行”。主要分为以下几个关键时机: --- ### 一、显式用户/应用请求 1. **直接执行 `DELETE` 语句** 当应用程序或用户显式执行 `DELETE` 语句时,SQL Server 会立即**启动删除逻辑**。例如: ```sql DELETE FROM Orders WHERE OrderDate < '2020-01-01'; -- 删除指定数据 ``` - **注意**:执行 `DELETE` 后数据不会立即物理删除(见下文机制)。 2. **通过触发器触发删除** 若目标表定义了 `INSTEAD OF DELETE` 或 `AFTER DELETE` 触发器([引用2][^2], [引用5][^5]),删除操作会触发相关逻辑: ```sql CREATE TRIGGER trg_AuditDelete ON Orders AFTER DELETE AS BEGIN INSERT INTO DeletionLog SELECT *, GETDATE() FROM deleted; -- 记录删除审计 END; ``` --- ### 二、自动维护任务 1. **计划作业(SQL Server Agent)** 通过定时任务执行清理脚本,例如定期删除历史数据: ```sql -- 每日凌晨清理90天前数据 EXEC sp_add_schedule @schedule_name = 'DailyClean', ...; EXEC sp_attach_schedule_to_job @job_name = 'CleanOldData', @schedule_name = 'DailyClean'; ``` 2. **索引/统计维护** 重建索引 (`ALTER INDEX REBUILD`) 或更新统计信息时,旧版本数据页会被标记为待清理。 --- ### 三、事务与锁机制控制 1. **事务提交后物理删除** 在显式事务中,删除操作需等待 `COMMIT` 后才生效: ```sql BEGIN TRANSACTION; DELETE FROM LargeTable WHERE Condition = 'expired'; -- 此时数据仅逻辑标记删除,物理删除在 COMMIT 后发生 COMMIT TRANSACTION; -- 物理删除在此刻生效 ``` 2. **锁竞争与死锁处理** - 若删除操作所需资源(如行锁、页锁)被其他事务占用,操作将被阻塞([引用3][^3])。 - 死锁时,SQL Server 根据锁超时设置(如 `SET LOCK_TIMEOUT 3000`)终止冲突方事务并回滚删除操作。 --- ### 四、存储引擎后台处理 1. **日志写入(Log Writer)** 删除操作首先写入**事务日志**(确保持久性),再由日志写入器异步刷盘。 2. **检查点(Checkpoint)** 定期将内存中已提交的“脏页”(含删除标记的数据页)写入磁盘: ```sql CHECKPOINT; -- 手动触发检查点 ``` 3. **幽灵记录清理(Ghost Cleanup)** - 后台线程每5秒运行一次,物理移除标记为“幽灵记录”的已删除数据。 - 可通过跟踪标志 `661` 禁用(不推荐)。 --- ### 五、内存压力与惰性写入 1. **缓冲池(Buffer Pool)管理** 当内存不足时,已删除但未刷盘的脏页可能被惰性写入器(Lazy Writer)优先写入磁盘以释放空间。 --- ### 优化建议 1. **批量删除** 大型删除操作分批次进行,避免长事务和锁膨胀([引用1][^1]): ```sql WHILE EXISTS (SELECT 1 FROM LargeTable WHERE Condition = 'expired') BEGIN DELETE TOP (1000) FROM LargeTable WHERE Condition = 'expired'; WAITFOR DELAY '00:00:01'; -- 减少锁竞争 END ``` 2. **控制事务粒度** 批量操作中每个批次单独提交事务,减少日志增长和阻塞风险。 3. **低峰期执行** 将数据清理任务安排在业务低峰期,最小化对性能的影响。 --- ### 关键结论 | **操作阶段** | **实际执行时机** | |---------------------|----------------------------------| | 逻辑删除标记 | `DELETE` 语句执行时 | | 事务日志写入 | 语句执行中(立即) | | 物理数据移除 | 幽灵清理任务运行时(异步延迟) | | 磁盘空间释放 | 检查点或惰性写入时(异步) | > ⚠️ 删除操作的实际完成是**逻辑标记即时生效** + **物理移除延迟发生**的组合过程,受事务、锁、后台任务共同影响。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值