病毒安全知识,电脑网络技术,手工杀毒方法,答疑解决笔记

导航

« 以系统时间命名文件的命令等windows XP软路由问题 »

归档数据与日期条件差异

  昨日对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

发表评论(无须注册,所有评论在审核通过后显示):

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

  • 微信订阅号
    微信订阅

最新发表

最新评论及回复

本站出现的所有广告均不代表本人及本站观点立场 | 关于我 | 网站地图 | 联系邮箱 | 返回顶部
Copyright 2008-2020 www.stormcn.cn. All Rights Reserved. Powered By Z-Blog.

闽公网安备 35010202000133号