昨日对ORACLE数据库中table1表进行整理归档,table1表中保存着从2007年开始至今的数据,这次归档整理的主要任务是将2007年至2008年数据中列名“NAME”不包括“storm”字符串的记录分别导出到2007与2008这两张表,并在原表中删除这些导出记录,使用TOAD中的SQL编辑窗口。
因为涉及删除,为保证数据不遗漏,先分别统计符合导出条件的2007年与2008年数据记录数,使用以下命令:
2007年:select count(*) from table1 where name not like '%storm%' and date<to_date('2008-1-1','yyyy-mm-dd')
2008年:select count(*) from table1 where name not like '%storm%' and date<to_date('2009-1-1','yyyy-mm-dd') and date>to_date('2007-12-31','yyyy-mm-dd')
然后用插入命令,分别插入到2007与2008表中:
2007:insert into table_2007 from table1 where name not like '%storm%' and date<to_date('2008-1-1','yyyy-mm-dd')
2008:insert into table_2008 from table1 where name not like '%storm%' and date<to_date('2009-1-1','yyyy-mm-dd') and date>to_date('2007-12-31','yyyy-mm-dd')
而删除将一次性使用命令:
delete from table1 where name not like '%storm%' and date<to_date('2009-1-1','yyyy-mm-dd')
因此在删除前又统计了下要删除的记录数,看是否与上面分别统计数之和相等,避免遗漏:
select count(*) from table1 where name not like '%storm%' and date<to_date('2009-1-1','yyyy-mm-dd')
运行完发现这最后一次统计的记录数与上面分别统计2007与2008记录数之和不相等,少了几十条记录。经过检查发现原来在计算2008记录数时用的日期条件“date>to_date('2007-12-31','yyyy-mm-dd')”有误,大于2007-12-31,即大于2007-12-31 00:00:00,而不是从2008-1-1 00:00:00开始计算,所以多算了2007-12-31这一天的数量。因此应改为:
select count(*) from table1 where name not like '%storm%' and date<to_date('2009-1-1','yyyy-mm-dd') and date>=to_date('2008-1-1','yyyy-mm-dd')
直接用date>to_date('2008-1-1','yyyy-mm-dd')应该也是可以的,不过在理论上少了2008-1-1 00:00:00这一时刻的记录,虽然这一时刻不一定有数据,但从数学上说还是用“>=”严格些。
>> 除非说明均为原创,如转载请注明来源于http://www.stormcn.cn/post/363.html