第一次来csdn发帖,如果发错了地方望版主见谅。有一个表d_time_period,他有个number字段prd_date表示日期,格式是yyyymmdd
d_time_period这张表有个class3字段为空。我想把class3这个字段update成为这样的格式:
04-11
12-19
20-27
这种表示星期的格式。上面的星期格式可以用这个sql查询出来:
select substr(to_char(prd_date,'yyyymmdd'),7,8)||'-'|| substr(to_char(prd_date+7,'yyyymmdd'),7,8) 
from d_time_period
where day_in_week=1  --day_in_week这个字段表示这一天是星期几但是接下来我不知道怎么办了:
1.怎么将这个查询结果update进class3这个字段啊?oracle报告这个sql返回的值多于一个;
2.怎样设置条件才能让d_time_period里面符合条件的7条记录被赋予同一个值呢?
比如说,假如a,b,c三条记录都属于01-08这一周,那么a,b,c三条记录的class2都是01-08.这个表有个字段week_in_year表示这一周是这一年的第几周。

解决方案 »

  1.   

    问问,你的number字段prd_date表示日期是唯一的么》?
    你把表结构和数据贴点出来,以及最终想得到的结果 写出来,
    虽然有些了解你的需求,但是细节不太清楚,
      

  2.   

    1.
    update d_time_period
    set class = substr(to_char(prd_date,'yyyymmdd'),7,8)||'-'|| substr(to_char(prd_date+7,'yyyymmdd'),7,8) ;
    2.有了第一步,这种情况就不存在了吧。。
      

  3.   


    感谢回复,这是表结构:
    -- Create table
    create table D_TIME_PERIOD
    (
      PRD_ID            INTEGER not null,
      PRD_SNO           INTEGER,
      TXN_PRD_SNO       INTEGER,
      PRD_DATE          DATE, --表示日期
      DAY_NAME          VARCHAR2(9),
      DAY_FULL_NAME     VARCHAR2(9),
      WEEK_NAME         VARCHAR2(9),
      WEEK_FULL_NAME    VARCHAR2(9),
      DAY_IN_WEEK       VARCHAR2(9),
      DAY_IN_MONTH      INTEGER,
      DAY_IN_YEAR       INTEGER,
      WEEK_IN_MONTH     INTEGER,
      WEEK_IN_YEAR      INTEGER, --表示这个星期是这一年的第几个星期
      MONTH_NAME        VARCHAR2(9),
      MONTH_FULL_NAME   VARCHAR2(9),
      MONTH_IN_YEAR     INTEGER,
      QTR_NAME          VARCHAR2(9),
      QTR_FULL_NAME     VARCHAR2(9),
      CALENDAR_QTR      INTEGER,
      MONTH_IN_QTR      INTEGER,
      WEEK_IN_QTR       INTEGER,
      DAY_IN_QTR        INTEGER,
      MONTH_IN_FNCL_QTR INTEGER,
      WEEK_IN_FNCL_QTR  INTEGER,
      DAY_IN_FNCL_QTR   INTEGER,
      SEMI_YEARLY       INTEGER,
      YEAR_NAME         VARCHAR2(9),
      YEAR_NUM          INTEGER,
      SEASON_NAME       VARCHAR2(9),
      HLDY_IND          VARCHAR2(9),
      TXN_DATE_IND      VARCHAR2(9),
      INSERT_TIME       DATE,
      CLASS1            NUMBER(6),
      CLASS2            NUMBER(6),
      CLASS3            VARCHAR2(20)
    )
      

  4.   


    update d_time_period
    set class = substr(to_char(prd_date,'yyyymmdd'),7,8)||'-'|| substr(to_char(prd_date+7,'yyyymmdd'),7,8) ;这样子update不行的,这样子每一行的class就都不同了。
    我需要让同一个星期的7天的这个字段都一样,例如:1月1日到1月7日的class都是01-07
      

  5.   

    我的想法是这样的:
    1.首先,确定这一天在这一年中是第几个星期的。找出这个星期的起始日期。如startDay,endDay.
    2.其次,用prd_date去 between startDay,endDay.
    3.在这期间的就把它update class3=startDay-endDay.
    注:我只是说说想法。谢谢了!
      

  6.   


    --楼主试试这个,我已测试通过的,你再测试下呢:
    merge INTO  d_time_period b
    USING(
        SELECT LEVEL week,
               (Trunc(SYSDATE,'yyyy')-To_Char(Trunc(SYSDATE,'yyyy'),'d')+1)+(LEVEL-1)*7  first_days,
               (Trunc(SYSDATE,'yyyy')+(7-To_Char(Trunc(SYSDATE,'yyyy'),'d')))+(LEVEL-1)*7 last_days
        FROM dual
        CONNECT BY LEVEL<=53
    ) a
    ON (a.week = b.day_in_week )
    WHEN matched THEN 
    UPDATE SET b.class3=substr(to_char(a.first_days,'yyyymmdd'),7,8)||'-'|| substr(to_char(a.last_days,'yyyymmdd'),7,8)
      

  7.   

    --附上测试数据:
    --原数据
    SELECT * FROM d_time_period;
    PRD_DATE    DAY_IN_WEEK    CLASS3
    --------------------------------------------
    20101109    46 
    20101110    46 
    20101111    46 
    20101112    46 
    20101114    47 
    20101115    47 
    20101116    47 
    20101117    47 --执行:
    merge INTO  d_time_period b
    USING
    (SELECT LEVEL week,
        (Trunc(SYSDATE,'yyyy')-To_Char(Trunc(SYSDATE,'yyyy'),'d')+1)+(LEVEL-1)*7  first_days,
        (Trunc(SYSDATE,'yyyy')+(7-To_Char(Trunc(SYSDATE,'yyyy'),'d')))+(LEVEL-1)*7 last_days
    FROM dual
    CONNECT BY LEVEL<=53
    ) a
    ON (a.week = b.day_in_week )
    WHEN matched THEN 
    UPDATE SET b.class3=substr(to_char(a.first_days,'yyyymmdd'),7,8)||'-'|| substr(to_char(a.last_days,'yyyymmdd'),7,8)
    --结果:
    SELECT * FROM d_time_period;
    PRD_DATE    DAY_IN_WEEK    CLASS3
    ----------------------------------------
    20101109    46             07-13
    20101110    46             07-13
    20101111    46             07-13
    20101112    46             07-13
    20101114    47             14-20
    20101115    47             14-20
    20101116    47             14-20
    20101117    47             14-20
      

  8.   

    补充一点:
    我上面的day_in_week字段,应该要换成你的week_in_year字段
    我写错了,sorry
    其它不变
      

  9.   


    饿。你这个方法好是好,但是我太菜了,看不大懂 - -!!!
    merge INTO  d_time_period b
    USING
    (SELECT LEVEL week,
        (Trunc(SYSDATE,'yyyy')-To_Char(Trunc(SYSDATE,'yyyy'),'d')+1)+(LEVEL-1)*7  first_days,
        (Trunc(SYSDATE,'yyyy')+(7-To_Char(Trunc(SYSDATE,'yyyy'),'d')))+(LEVEL-1)*7 last_days
    FROM dual
    CONNECT BY LEVEL<=53
    )这个地方的逻辑你能给我解释下吗? :)
      

  10.   

    一两句说不清楚,你可以看看merge into 用法:http://wenku.baidu.com/view/1308e0563c1ec5da50e27006.html