如何在SQL中仅通过日期删除DateTime类型字段对应的记录
解决方案
核心逻辑为忽略DateTime类型的时间部分,精准匹配目标日期全时段的记录即可,以下是不同场景的实现方案:
通用兼容写法(全数据库适配,优先推荐)
不依赖数据库专属函数,且可利用日期时间字段上的索引,性能最优,适合所有场景:
DELETE FROM 你的表名 WHERE 日期时间字段名 >= '2021-11-02' AND 日期时间字段名 < '2021-11-03';
逻辑说明:匹配所有大于等于目标日期0点、小于目标日期后一天0点的记录,刚好覆盖目标日期的全部时间段,不会漏删也不会多删。
各数据库专属简化写法
无需跨库兼容的场景下可以使用,写法更直观:
- MySQL/MariaDB 写法
DELETE FROM 你的表名 WHERE DATE(日期时间字段名) = '2021-11-02';
注意:该写法会对字段做函数转换,导致索引失效,数据量较大时性能不如通用范围查询
- SQL Server 写法
DELETE FROM 你的表名 WHERE CAST(日期时间字段名 AS DATE) = '2021-11-02';
- PostgreSQL 写法
DELETE FROM 你的表名 WHERE 日期时间字段名::DATE = '2021-11-02';
- Oracle 写法
DELETE FROM 你的表名 WHERE TRUNC(日期时间字段名) = DATE '2021-11-02';
操作前必看注意事项
- 先执行SELECT验证待删除记录是否正确,避免误删:
SELECT * FROM 你的表名 WHERE 日期时间字段名 >= '2021-11-02' AND 日期时间字段名 < '2021-11-03';
- 生产环境操作建议开启事务,确认无误后再提交:
-- 以MySQL为例 BEGIN; DELETE FROM 你的表名 WHERE 日期时间字段名 >= '2021-11-02' AND 日期时间字段名 < '2021-11-03'; -- 确认删除数量正确后执行提交 COMMIT; -- 误删可执行回滚 ROLLBACK;
内容的提问来源于stack exchange,提问作者Random
相关产品推荐
相关产品推荐

