我试图在问题历史中搜索这个类似的问题,但找不到任何与我想要做的事情相符的事情。希望有人可以提供帮助。我有一个表中有一些存档数据,其时间戳回到1/1/1900。不确定那个日期是怎么发生的,我认为它可能是基于一些旧的应用程序的时间戳。无论如何,数据是我公司需要在这些存档表中保留的有效数据。然而,为了努力定期清理数据,我们希望能够清除日期超过60天但没有触及1900年旧时间戳的数据。有没有办法可以使用语法来完成这个?我以为我可以做这样的事情但可能过于简单化了:
- 例如: - 查找超过60天的记录&转储到临时表
select transid into #cdm_delete_table from cdmtrans where exporttime < getdate()-60
- 然后将这些记录保存在临时表中,从主表中执行删除操作。 - 但是这样可以摆脱所有你想要的记录
delete from cdmtrans where transid in (select transid from #cdm_delete_table)
- 但是,我想根据一系列日期进行删除。 - 然后60天,但比01/01/1900更加重要。这会起作用吗?
delete FROM cdmtrans WHERE transid BETWEEN '01/01/1901' and getdate()-60
OR
delete from cdmtrans where transid in
(select transid from #cdm_delete_table WHERE transid BETWEEN '01/01/1901' and getdate()-60)
这是我迷路的地方。如果我走在正确的轨道上,希望有人能为我澄清。 Thx提前。
答案 0 :(得分:0)
此查询应该为您提供所需内容:
DELETE FROM cdmtrans
WHERE exporttime < getdate() -60
AND exporttime <> '1900-01-01'
答案 1 :(得分:0)
你肯定是在正确的轨道上。我想你正在寻找这样的查询:
DELETE FROM cdmtrans
WHERE exporttime > '19010101'
AND exporttime < getdate() - 60;
(请注意,查询中不需要transid
来删除正确的记录。)
如果您想检查这是否为您提供了正确的设置删除,请先查询SELECT
查询,如下所示:
SELECT *
FROM cdmtrans
WHERE exporttime > '19010101'
AND exporttime < getdate() - 60;
答案 2 :(得分:0)
AND
比较器可以是你的朋友。用它来选择不等于'01/01/1901'
且超过60天的记录。
-- select all records older than 60 days and are not '1/1/1900' into temp table
SELECT transid
INTO #cdm_delete_table
FROM cdmtrans
WHERE exporttime < DATEDIFF(dd, GETDATE(), 60)
AND exporttime != '01/01/1901'
-- remove from main table
DELETE
FROM cdmtrans
WHERE transid IN (
SELECT transid
FROM #cdm_delete_table
)
-- or skip the temp table and do it in one query
DELETE
FROM cdmtrans
WHERE exporttime < DATEDIFF(dd, GETDATE(), 60)
AND exporttime != '01/01/1901'