查询&在date和getdate()之间清除数据

时间:2013-07-05 18:41:57

标签: tsql

我试图在问题历史中搜索这个类似的问题,但找不到任何与我想要做的事情相符的事情。希望有人可以提供帮助。我有一个表中有一些存档数据,其时间戳回到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提前。

3 个答案:

答案 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'