第一次来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表示这一周是这一年的第几周。
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表示这一周是这一年的第几周。
你把表结构和数据贴点出来,以及最终想得到的结果 写出来,
虽然有些了解你的需求,但是细节不太清楚,
update d_time_period
set class = substr(to_char(prd_date,'yyyymmdd'),7,8)||'-'|| substr(to_char(prd_date+7,'yyyymmdd'),7,8) ;
2.有了第一步,这种情况就不存在了吧。。
感谢回复,这是表结构:
-- 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)
)
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
1.首先,确定这一天在这一年中是第几个星期的。找出这个星期的起始日期。如startDay,endDay.
2.其次,用prd_date去 between startDay,endDay.
3.在这期间的就把它update class3=startDay-endDay.
注:我只是说说想法。谢谢了!
--楼主试试这个,我已测试通过的,你再测试下呢:
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
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
我上面的day_in_week字段,应该要换成你的week_in_year字段
我写错了,sorry
其它不变
饿。你这个方法好是好,但是我太菜了,看不大懂 - -!!!
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
)这个地方的逻辑你能给我解释下吗? :)