如何按日期插入记录

maksim_wei 2009-02-24 04:05:34
背景:
系统每天生成一个文件,并在表FILE_INFO中记录文件信息。

需求:
如果系统挂了n天,在这n天内没有生成文件,也没有在表FILE_INFO中插入文件信息,需要在系统恢复后将前面n天没有插入表中的记录补齐

表结构如下:
create table FILE_INFO
(
FILE_ID VARCHAR2(20) not null,
FILE_NAME VARCHAR2(50) not null,
FILES_TYPE CHAR(1) not null,
JOURNAL_DATE DATE not null,
FILE_STATUS CHAR(1) not null
)

问题:
如何用sql语句实现将前面30天内不存在的文件记录补齐。

如果很简单,高手请勿嘲笑,谢谢!
...全文
158 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
vc555 2009-02-24
  • 打赏
  • 举报
回复
最好还是写个过程,先要判断缺的是哪些天数,然后再插入。
maksim_wei 2009-02-24
  • 打赏
  • 举报
回复

insert into journal_file_info(FILE_ID, FILE_NAME, FILES_TYPE, JOURNAL_DATE, FILE_STATUS)
select c.ID+rownum,'trade-'||to_char(a.vdat,'yyyymmdd'),'0',a.vdat,'0'
from (select to_date(to_char(sysdate- rownum,'yyyy/mm/dd'),'yyyy/mm/dd') vdat
from dual
connect by rownum <=30) a,
journal_file_info b,
(select nvl(max(to_number(FILE_ID)), 0) ID from journal_file_info) c
where a.vdat=b.JOURNAL_DATE(+) and b.JOURNAL_DATE is null;


我改成上面的sql语句,但是好像测试不通过,第一次插入了30条记录,然后我删除了中间某一条记录,再次运行该sql,并没有把我刚刚删除的记录补上,奇怪了!
maksim_wei 2009-02-24
  • 打赏
  • 举报
回复
算了,前面30天自己看了一下,已经搞定了

但是本人很笨,如果要前面3个自然月的怎么搞呢?如果有必要,大家吱一声,另开帖送分!
maksim_wei 2009-02-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ling242a 的回复:]
上面的有点问题,因为FILE_ID是字符串,所以不能这样来得到最大值
你想个办法来得到已经存在的FILE_ID的最大值就好
如果确定FILE_ID是数字的字符串
那就可以这样

SQL code
insert into FILE_INFO(FILE_ID, FILE_NAME, FILES_TYPE, JOURNAL_DATE, FILE_STATUS)
select c.ID+rownum,'trade-'||to_char(a.vdat,'yyyymmdd'),'0',a.vdat,'0'
from (select to_date(to_char(sysdate+ rownum-1,'yyyy/mm/dd'),'yyyy/mm/…
[/Quote]

牛人!!除了牛人我还能说啥???

的确,file_id是数字,因为其它原因要存成字符串类型。而且还有个小问题,我要求的是补齐当前日期前面30天的记录,而不是当前日期后面30天的记录,呵呵,谢谢!搞定马上结分。
白发程序猿 2009-02-24
  • 打赏
  • 举报
回复
上面的有点问题,因为FILE_ID是字符串,所以不能这样来得到最大值
你想个办法来得到已经存在的FILE_ID的最大值就好
如果确定FILE_ID是数字的字符串
那就可以这样

insert into FILE_INFO(FILE_ID, FILE_NAME, FILES_TYPE, JOURNAL_DATE, FILE_STATUS)
select c.ID+rownum,'trade-'||to_char(a.vdat,'yyyymmdd'),'0',a.vdat,'0'
from (select to_date(to_char(sysdate+ rownum-1,'yyyy/mm/dd'),'yyyy/mm/dd') vdat
from dual
connect by rownum <=30) a,
FILE_INFO b,
(select nvl(max(to_number(FILE_ID)), 0) ID from FILE_INFO) c
where a.vdat=b.JOURNAL_DATE(+) and b.JOURNAL_DATE is null
阿三 2009-02-24
  • 打赏
  • 举报
回复
类似这样取值,把rownum换成你的序列如 fileid.nextval这样
SELECT rownum id,
'trade-'||to_char(TO_DATE('20090224','YYYYMMDD') - ROWNUM,'yyyymmdd')||'.txt' filename,
0 file_type,
TO_DATE('20090224','YYYYMMDD') - ROWNUM AS SERIESDATE FROM DUAL
CONNECT BY rownum<30
白发程序猿 2009-02-24
  • 打赏
  • 举报
回复
是当前日期后退30天吗?如果不是,你能把sysdate换成你想要的那个日期

insert into FILE_INFO(FILE_ID, FILE_NAME, FILES_TYPE, JOURNAL_DATE, FILE_STATUS)
select c.ID+rownum,'trade-'||to_char(a.vdat,'yyyymmdd'),'0',a.vdat,'0'
from (select to_date(to_char(sysdate+ rownum-1,'yyyy/mm/dd'),'yyyy/mm/dd') vdat
from dual
connect by rownum <=30) a,
FILE_INFO b,
(select nvl(max(FILE_ID), 0) ID from FILE_INFO) c
where a.vdat=b.JOURNAL_DATE(+) and b.JOURNAL_DATE is null
maksim_wei 2009-02-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lpc19598188 的回复:]
你插入n条符合格式的记录不就完了,把当时的日期填进去,按规则给些数据
insert into FILE_INFO(FILE_ID, FILE_NAME, FILES_TYPE, JOURNAL_DATE, FILE_STATUS)
values ('testid1', 'testname1', 'N', to_date('2009-2-24','YYYY-MM-DD'), 'N' );
[/Quote]

如果用程序来判断,当然很容易,我取出前面30天的所有记录,用个for循环就ok了,就是不想这样做,希望用sql语句来完成,谢谢!
maksim_wei 2009-02-24
  • 打赏
  • 举报
回复
Sorry,可能我没说清楚
1. 我希望用一条SQL语句完成所有的记录插入
2. 其它字段说明如下:
a、file_id自增长
b、file_name格式是:trade-文件生成日期.txt。例如:trade-20090224.txt
c、file_type固定为0
d、journal_date为文件生成日期
e、file_states固定为0
Andy__Huang 2009-02-24
  • 打赏
  • 举报
回复
日期补入是容易是,其他字段被什么内容呢?
又是违规昵称 2009-02-24
  • 打赏
  • 举报
回复
你插入n条符合格式的记录不就完了,把当时的日期填进去,按规则给些数据
insert into FILE_INFO(FILE_ID, FILE_NAME, FILES_TYPE, JOURNAL_DATE, FILE_STATUS)
values ('testid1', 'testname1', 'N', to_date('2009-2-24','YYYY-MM-DD'), 'N' );

vc555 2009-02-24
  • 打赏
  • 举报
回复
当补全记录时,在表上做insert操作时,如何取得需要insert的记录的值呢?

17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧