获得星期几,怎么写?

all716 2010-07-21 09:24:53
在存储过程中,我需要得到每个月第三个星期的星期三,该怎么写?刚学oracle,好多不懂,帮帮忙详细点,谢谢!
...全文
564 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
dx286123549 2010-07-22
  • 打赏
  • 举报
回复
学习。。。
all716 2010-07-22
  • 打赏
  • 举报
回复
我题目意思搞混了,比如这个月是7月,我要得到7月21号,就是这个月的倒数第2星期的星期三,如果是8月,则是8月18号。如果是9月,则是9月22号。
心中的彩虹 2010-07-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wkc168 的回复:]
SQL code

--这样看是否
SQL> select to_char(sysdate,'day') from dual;

TO_CHAR(S
---------
星期三
[/Quote]



--函数来解决返回某个日期所在月的第三个星期三的日期
SQL> alter session set nls_date_format='yyyy-mm-dd';

会话已更改。

SQL> create or replace function fun1(dt date) return date
2 as
3 v_dt date;
4 v_day date;
5 v_dt2 date;
6 begin
7 if to_char(dt,'mm') ='02' then
8 for i in 1..28 loop
9 select to_date(to_char(dt,'yyyy-mm')||'-'||decode(length(i),1,'0'||to_char(i),2,to_char(i)))
10 into v_dt from dual;
11 if to_char(v_dt,'day')='星期三' then
12 goto lop1;
13 end if;
14 end loop;
15 elsif to_char(dt,'mm') in('03','05','07','08','10','12') then
16 for i in 1..31 loop
17 select to_date(to_char(dt,'yyyy-mm')||'-'||decode(length(i),1,'0'||to_char(i),2,to_char(i)))
18 into v_dt from dual;
19 if to_char(v_dt,'day')='星期三' then
20 goto lop1;
21 end if;
22 end loop;
23 elsif to_char(dt,'mm') in('04','06','09','11') then
24 for i in 1..30 loop
25 select to_date(to_char(dt,'yyyy-mm')||'-'||decode(length(i),1,'0'||to_char(i),2,to_char(i)))
26 into v_dt from dual;
27 if to_char(v_dt,'day')='星期三' then
28 goto lop1;
29 end if;
30 end loop;
31 end if;
32 <<lop1>>
33 select v_dt+14 into v_dt2 from dual;
34 return v_dt2;
35 end;
36 /

函数已创建。

SQL> select fun1(sysdate) from dual;

FUN1(SYSDA
----------
2010-07-21

SQL> select fun1(date'2010-02-15') from dual;

FUN1(DATE'
----------
2010-02-17

SQL> select fun1(date'2010-11-12') from dual;

FUN1(DATE'
----------
2010-11-17





cqhweb 2010-07-22
  • 打赏
  • 举报
回复
在oracle中处理日期大全 
  TO_DATE格式
Day:
dd number 12
dy abbreviated fri
day spelled out friday
ddspth spelled out, ordinal twelfth
Month:
mm number 03
mon abbreviated mar
month spelled out march
Year:
yy two digits 98
yyyy four digits 1998
  --24小时格式下时间范围为: 0:00:00 - 23:59:59....
  --12小时格式下时间范围为: 1:00:00 - 12:59:59 ....
  --1.日期和字符转换函数用法(to_date,to_char)
  2.select to_char( to_date(222,'J'),'Jsp') from dual
  显示Two Hundred Twenty-Two
  --3.求某天是星期几
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual;
星期一
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;
monday
  --设置日期语言
ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';
  --也可以这样
TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American')
  --4.两个日期间的天数
select floor(sysdate - to_date('20020405','yyyymmdd')) from dual;
  --5. 时间为null的用法
select id, active_date from table1
UNION
select 1, TO_DATE(null) from dual;
  --注意要用TO_DATE(null)
--6.a_date between to_date('20011201','yyyymmdd') and to_date('20011231','yyyymmdd')
 -- 那么12月31号中午12点之后和12月1号的12点之前是不包含在这个范围之内的。
 -- 所以,当时间需要精确的时候,觉得to_char还是必要的
 -- 7. 日期格式冲突问题
 -- 输入的格式要看你安装的ORACLE字符集的类型, 比如: US7ASCII, date格式的类型就是:
'01-Jan-01'
alter system set NLS_DATE_LANGUAGE = American
alter session set NLS_DATE_LANGUAGE = American
 -- 或者在to_date中写
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;
 -- 注意我这只是举了NLS_DATE_LANGUAGE,当然还有很多,
 -- 可查看
select * from nls_session_parameters
select * from V$NLS_PARAMETERS
luoyoumou 2010-07-22
  • 打赏
  • 举报
回复
-- Oracle 查看本月第几周的星期几

-- 搭建测试环境:

create table t(id number, cdate date);
insert into t(id, cdate) values(1,to_date('2010-01-01','yyyy-mm-dd'));
insert into t(id, cdate) values(2,to_date('2010-02-01','yyyy-mm-dd'));
insert into t(id, cdate) values(3,to_date('2010-03-01','yyyy-mm-dd'));
insert into t(id, cdate) values(4,to_date('2010-04-01','yyyy-mm-dd'));
insert into t(id, cdate) values(5,to_date('2010-05-01','yyyy-mm-dd'));
insert into t(id, cdate) values(6,to_date('2010-06-01','yyyy-mm-dd'));
insert into t(id, cdate) values(7,to_date('2010-07-01','yyyy-mm-dd'));
insert into t(id, cdate) values(8,to_date('2010-08-01','yyyy-mm-dd'));
insert into t(id, cdate) values(9,to_date('2010-09-01','yyyy-mm-dd'));
insert into t(id, cdate) values(10,to_date('2010-10-01','yyyy-mm-dd'));
insert into t(id, cdate) values(11,to_date('2010-11-01','yyyy-mm-dd'));
insert into t(id, cdate) values(12,to_date('2010-12-01','yyyy-mm-dd'));

commit;

---------在存储过程中,我需要得到每个月第三个星期的星期三,该怎么写?刚学oracle,好多不懂,帮帮忙详细点,谢谢!

-- (你原来的意思,函数如下:)

create or replace function week_day_asc(
i_cdate date,
i_week number default 1, -- 本月第几周
i_day number default 1 -- 本月的星期几
)
return date
as
v_cdate date;
v_week number;
begin
v_week := to_char(trunc(last_day(sysdate),'D'),'w');
if i_week >0 and i_week <=5 and i_day>=0 and i_day<=7 then
v_cdate := trunc(trunc(i_cdate,'mm')+7-i_day,'D')+i_week*7-7+i_day-1;

if trunc(i_cdate,'mm') <> trunc(v_cdate,'mm') then -- 跨月份啦
v_cdate := null;
end if;
else
v_cdate := null;
end if;
return v_cdate;
end;
/

---------------------------------- 测试 -------------------------------------------
select t.id, t.cdate,
week_day_asc(t.cdate,1,1), -- 第一周的星期日(是第一周的第一天)
to_char(week_day_asc(t.cdate,1,1),'w'), -- 查看用函数出来的结果是本月第几周
to_char(week_day_asc(t.cdate,1,1),'Day') -- 查看用函数出来的结果是本月的星期几
from t;

select t.id, t.cdate,
week_day_asc(t.cdate,1,2), -- 第一周的星期一(是第一周的第二天)
to_char(week_day_asc(t.cdate,1,2),'w'), -- 查看用函数出来的结果是本月第几周
to_char(week_day_asc(t.cdate,1,2),'Day') -- 查看用函数出来的结果是本月的星期几
from t;

select t.id, t.cdate,
week_day_asc(t.cdate,1,3), -- 第一周的星期二(是第一周的第三天)
to_char(week_day_asc(t.cdate,1,3),'w'), -- 查看用函数出来的结果是本月第几周
to_char(week_day_asc(t.cdate,1,3),'Day') -- 查看用函数出来的结果是本月的星期几
from t;

select t.id, t.cdate,
week_day_asc(t.cdate,1,4), -- 第一周的星期三(是第一周的第四天)
to_char(week_day_asc(t.cdate,1,4),'w'), -- 查看用函数出来的结果是本月第几周
to_char(week_day_asc(t.cdate,1,4),'Day') -- 查看用函数出来的结果是本月的星期几
from t;

select t.id, t.cdate,
week_day_asc(t.cdate,1,5), -- 第一周的星期四(是第一周的第五天)
to_char(week_day_asc(t.cdate,1,5),'w'), -- 查看用函数出来的结果是本月第几周
to_char(week_day_asc(t.cdate,1,5),'Day') -- 查看用函数出来的结果是本月的星期几
from t;

select t.id, t.cdate,
week_day_asc(t.cdate,1,7), -- 第一周的星期六(是第一周的第七天)
to_char(week_day_asc(t.cdate,1,7),'w'), -- 查看用函数出来的结果是本月第几周
to_char(week_day_asc(t.cdate,1,7),'Day') -- 查看用函数出来的结果是本月的星期几
from t;

select t.id, t.cdate,
week_day_asc(t.cdate,3,4), -- 第三周的星期三(是第三周的第四天)
to_char(week_day_asc(t.cdate,3,4),'w'), -- 查看用函数出来的结果是本月第几周
to_char(week_day_asc(t.cdate,3,4),'Day') -- 查看用函数出来的结果是本月的星期几
from t;

select t.id, t.cdate,
week_day_asc(t.cdate,5,4), -- 第五周的星期三(是第五周的第四天,由于有的月份天数不够,应该有很多空值)
to_char(week_day_asc(t.cdate,5,4),'w'), -- 查看用函数出来的结果是本月第几周
to_char(week_day_asc(t.cdate,5,4),'Day') -- 查看用函数出来的结果是本月的星期几
from t;


ID CDATE WEEK_DAY_ASC(T.CDAT TO TO_CHAR(WEEK_DAY_ASC(T.C
---------- ------------------- ------------------- -- ------------------------
1 2010-01-01 00:00:00
2 2010-02-01 00:00:00
3 2010-03-01 00:00:00 2010-03-31 00:00:00 5 星期三
4 2010-04-01 00:00:00
5 2010-05-01 00:00:00
6 2010-06-01 00:00:00 2010-06-30 00:00:00 5 星期三
7 2010-07-01 00:00:00
8 2010-08-01 00:00:00
9 2010-09-01 00:00:00 2010-09-29 00:00:00 5 星期三
10 2010-10-01 00:00:00
11 2010-11-01 00:00:00
12 2010-12-01 00:00:00 2010-12-29 00:00:00 5 星期三

已选择12行。

--///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

-- 我题目意思搞混了,比如这个月是7月,我要得到7月21号,就是这个月的倒数第2星期的星期三,
-- 如果是8月,则是8月18号。如果是9月,则是9月22号。
-- (你现在的意思,函数如下:)
create or replace function week_day_desc(
i_cdate date,
i_week number default 1, -- 本月的倒数第几周
i_day number default 1 -- 本月的星期几
)
return date
as
v_cdate date;
v_week number;
begin
v_week := to_char(trunc(last_day(sysdate),'D'),'w');
if i_week >0 and i_week <=5 and i_day>=0 and i_day<=7 then
v_cdate := trunc(last_day(i_cdate)-i_day,'D')-i_week*7+7+i_day-1;

if trunc(i_cdate,'mm') < trunc(v_cdate,'mm') then -- 跨月份啦
v_cdate := v_cdate - 7;
end if;

if trunc(i_cdate,'mm') > trunc(v_cdate,'mm') then -- 跨月份啦
v_cdate := null;
end if;

else
v_cdate := null;
end if;
return v_cdate;
end;
/

---------------------------------- 测试 -------------------------------------------

-- 本月最后一个星期三:
select t.id, t.cdate,
week_day_desc(t.cdate,1,4), -- 本月最后一个星期三 的日期是多少
to_char(week_day_desc(t.cdate,1,4),'w'), -- 查看用函数出来的结果是本月第几周
to_char(week_day_desc(t.cdate,1,4),'Day') -- 查看用函数出来的结果是本月的星期几
from t;

ID CDATE WEEK_DAY_DESC(T.CDA TO TO_CHAR(WEEK_DAY_DESC(T.
---------- ------------------- ------------------- -- ------------------------
1 2010-01-01 00:00:00 2010-01-27 00:00:00 4 星期三
2 2010-02-01 00:00:00 2010-02-24 00:00:00 4 星期三
3 2010-03-01 00:00:00 2010-03-31 00:00:00 5 星期三
4 2010-04-01 00:00:00 2010-04-28 00:00:00 4 星期三
5 2010-05-01 00:00:00 2010-05-26 00:00:00 4 星期三
6 2010-06-01 00:00:00 2010-06-30 00:00:00 5 星期三
7 2010-07-01 00:00:00 2010-07-28 00:00:00 4 星期三
8 2010-08-01 00:00:00 2010-08-25 00:00:00 4 星期三
9 2010-09-01 00:00:00 2010-09-29 00:00:00 5 星期三
10 2010-10-01 00:00:00 2010-10-27 00:00:00 4 星期三
11 2010-11-01 00:00:00 2010-11-24 00:00:00 4 星期三
12 2010-12-01 00:00:00 2010-12-29 00:00:00 5 星期三

已选择12行。

-- 本月倒数第二个星期三:

select t.id, t.cdate,
week_day_desc(t.cdate,2,4), -- 按照楼主的举例,应该是说这个月的 倒数第2个星期三 的日期是多少
to_char(week_day_desc(t.cdate,2,4),'w'), -- 查看用函数出来的结果是本月第几周
to_char(week_day_desc(t.cdate,2,4),'Day') -- 查看用函数出来的结果是本月的星期几
from t;

ID CDATE WEEK_DAY_DESC(T.CDA TO TO_CHAR(WEEK_DAY_DESC(T.
---------- ------------------- ------------------- -- ------------------------
1 2010-01-01 00:00:00 2010-01-20 00:00:00 3 星期三
2 2010-02-01 00:00:00 2010-02-17 00:00:00 3 星期三
3 2010-03-01 00:00:00 2010-03-24 00:00:00 4 星期三
4 2010-04-01 00:00:00 2010-04-21 00:00:00 3 星期三
5 2010-05-01 00:00:00 2010-05-19 00:00:00 3 星期三
6 2010-06-01 00:00:00 2010-06-23 00:00:00 4 星期三
7 2010-07-01 00:00:00 2010-07-21 00:00:00 3 星期三
8 2010-08-01 00:00:00 2010-08-18 00:00:00 3 星期三
9 2010-09-01 00:00:00 2010-09-22 00:00:00 4 星期三
10 2010-10-01 00:00:00 2010-10-20 00:00:00 3 星期三
11 2010-11-01 00:00:00 2010-11-17 00:00:00 3 星期三
12 2010-12-01 00:00:00 2010-12-22 00:00:00 4 星期三

已选择12行。



-- 本月倒数第三个星期三:

select t.id, t.cdate,
week_day_desc(t.cdate,3,4),
to_char(week_day_desc(t.cdate,3,4),'w'), -- 查看用函数出来的结果是本月第几周
to_char(week_day_desc(t.cdate,3,4),'Day') -- 查看用函数出来的结果是本月的星期几
from t;

-- 本月倒数第四个星期三:

select t.id, t.cdate,
week_day_desc(t.cdate,4,4),
to_char(week_day_desc(t.cdate,4,4),'w'), -- 查看用函数出来的结果是本月第几周
to_char(week_day_desc(t.cdate,4,4),'Day') -- 查看用函数出来的结果是本月的星期几
from t;

-- 本月倒数第五个星期三:

select t.id, t.cdate,
week_day_desc(t.cdate,5,4), -- 倒数第五个星期三(由于有的月份天数不够,应该有很多空值)
to_char(week_day_desc(t.cdate,5,4),'w'), -- 查看用函数出来的结果是本月第几周
to_char(week_day_desc(t.cdate,5,4),'Day') -- 查看用函数出来的结果是本月的星期几
from t;
cyz0606 2010-07-22
  • 打赏
  • 举报
回复
SQL> SELECT dd, to_char(dd, 'day')
2 FROM (SELECT dd, row_number() over(PARTITION BY mm ORDER BY dd) rn
3 FROM (SELECT dd, to_char(dd, 'mm') mm
4 FROM (SELECT trunc(SYSDATE, 'yyyy') + LEVEL - 1 dd
5 FROM dual
6 CONNECT BY LEVEL <= last_day(add_months(trunc(SYSDATE, 'yyyy'), 11)) -
7 trunc(SYSDATE, 'yyyy') + 1)
8 WHERE to_char(dd, 'd') = 4))
9 WHERE rn = 3;

这个是得出的是一年中每个月的第三个星期三
luoyoumou 2010-07-22
  • 打赏
  • 举报
回复
-- 这样修正一下,更直观一些:
-- Oracle 查看本月第几周的星期几

-- 搭建测试环境:

create table t(id number, cdate date);
insert into t(id, cdate) values(1,to_date('2010-01-01','yyyy-mm-dd'));
insert into t(id, cdate) values(2,to_date('2010-02-01','yyyy-mm-dd'));
insert into t(id, cdate) values(3,to_date('2010-03-01','yyyy-mm-dd'));
insert into t(id, cdate) values(4,to_date('2010-04-01','yyyy-mm-dd'));
insert into t(id, cdate) values(5,to_date('2010-05-01','yyyy-mm-dd'));
insert into t(id, cdate) values(6,to_date('2010-06-01','yyyy-mm-dd'));
insert into t(id, cdate) values(7,to_date('2010-07-01','yyyy-mm-dd'));
insert into t(id, cdate) values(8,to_date('2010-08-01','yyyy-mm-dd'));
insert into t(id, cdate) values(9,to_date('2010-09-01','yyyy-mm-dd'));
insert into t(id, cdate) values(10,to_date('2010-10-01','yyyy-mm-dd'));
insert into t(id, cdate) values(11,to_date('2010-11-01','yyyy-mm-dd'));
insert into t(id, cdate) values(12,to_date('2010-12-01','yyyy-mm-dd'));

commit;

---------在存储过程中,我需要得到每个月第三个星期的星期三,该怎么写?刚学oracle,好多不懂,帮帮忙详细点,谢谢!

-- (你原来的意思,函数如下:)

create or replace function week_day_asc(
i_cdate date,
i_week number default 1, -- 本月第几周
i_day number default 1 -- 本月的星期几
)
return date
as
v_cdate date;
v_week number;
begin
v_week := to_char(trunc(last_day(sysdate),'D'),'w');
if i_week >0 and i_week <=5 and i_day>=0 and i_day<=7 then
v_cdate := trunc(trunc(i_cdate,'mm')+3,'D')+i_week*7-7+i_day-1;

if trunc(i_cdate,'mm') <> trunc(v_cdate,'mm') then -- 跨月份啦
v_cdate := null;
end if;
else
v_cdate := null;
end if;
return v_cdate;
end;
/

---------------------------------- 测试 -------------------------------------------
select t.id, t.cdate,
week_day_asc(t.cdate,3,4), -- 第三周的星期三(是第三周的第四天)
to_char(week_day_asc(t.cdate,3,4),'w'), -- 查看用函数出来的结果是本月第几周
to_char(week_day_asc(t.cdate,3,4),'Day') -- 查看用函数出来的结果是本月的星期几
from t;

ID CDATE WEEK_DAY_ASC(T.CDAT TO TO_CHAR(WEEK_DAY_ASC(T.C
---------- ------------------- ------------------- -- ------------------------
1 2010-01-01 00:00:00 2010-01-20 00:00:00 3 星期三
2 2010-02-01 00:00:00 2010-02-17 00:00:00 3 星期三
3 2010-03-01 00:00:00 2010-03-17 00:00:00 3 星期三
4 2010-04-01 00:00:00 2010-04-21 00:00:00 3 星期三
5 2010-05-01 00:00:00 2010-05-19 00:00:00 3 星期三
6 2010-06-01 00:00:00 2010-06-16 00:00:00 3 星期三
7 2010-07-01 00:00:00 2010-07-21 00:00:00 3 星期三
8 2010-08-01 00:00:00 2010-08-18 00:00:00 3 星期三
9 2010-09-01 00:00:00 2010-09-15 00:00:00 3 星期三
10 2010-10-01 00:00:00 2010-10-20 00:00:00 3 星期三
11 2010-11-01 00:00:00 2010-11-17 00:00:00 3 星期三
12 2010-12-01 00:00:00 2010-12-15 00:00:00 3 星期三

已选择12行。

select t.id, t.cdate,
week_day_asc(t.cdate,5,4), -- 第五周的星期三(是第五周的第四天,由于有的月份天数不够,应该有很多空值)
to_char(week_day_asc(t.cdate,5,4),'w'), -- 查看用函数出来的结果是本月第几周
to_char(week_day_asc(t.cdate,5,4),'Day') -- 查看用函数出来的结果是本月的星期几
from t;


ID CDATE WEEK_DAY_ASC(T.CDAT TO TO_CHAR(WEEK_DAY_ASC(T.C
---------- ------------------- ------------------- -- ------------------------
1 2010-01-01 00:00:00
2 2010-02-01 00:00:00
3 2010-03-01 00:00:00 2010-03-31 00:00:00 5 星期三
4 2010-04-01 00:00:00
5 2010-05-01 00:00:00
6 2010-06-01 00:00:00 2010-06-30 00:00:00 5 星期三
7 2010-07-01 00:00:00
8 2010-08-01 00:00:00
9 2010-09-01 00:00:00 2010-09-29 00:00:00 5 星期三
10 2010-10-01 00:00:00
11 2010-11-01 00:00:00
12 2010-12-01 00:00:00 2010-12-29 00:00:00 5 星期三

已选择12行。

--///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

-- 我题目意思搞混了,比如这个月是7月,我要得到7月21号,就是这个月的倒数第2星期的星期三,
-- 如果是8月,则是8月18号。如果是9月,则是9月22号。
-- (你现在的意思,函数如下:)
create or replace function week_day_desc(
i_cdate date,
i_week number default 1, -- 本月的倒数第几周
i_day number default 1 -- 本月的星期几
)
return date
as
v_cdate date;
v_week number;
begin
v_week := to_char(trunc(last_day(sysdate),'D'),'w');
if i_week >0 and i_week <=5 and i_day>=0 and i_day<=7 then
v_cdate := trunc(last_day(i_cdate)-3,'D')-i_week*7+7+i_day-1;

if trunc(i_cdate,'mm') <> trunc(v_cdate,'mm') then -- 跨月份啦
v_cdate := v_cdate - 7;
end if;
else
v_cdate := null;
end if;
return v_cdate;
end;
/

---------------------------------- 测试 -------------------------------------------

-- 本月最后一个星期三:
select t.id, t.cdate,
week_day_desc(t.cdate,1,4), -- 按照楼主的举例,应该是说这个月的 倒数第1个星期三 的日期是多少
to_char(week_day_desc(t.cdate,1,4),'w'), -- 查看用函数出来的结果是本月第几周
to_char(week_day_desc(t.cdate,1,4),'Day') -- 查看用函数出来的结果是本月的星期几
from t;

ID CDATE WEEK_DAY_DESC(T.CDA TO TO_CHAR(WEEK_DAY_DESC(T.
---------- ------------------- ------------------- -- ------------------------
1 2010-01-01 00:00:00 2010-01-27 00:00:00 4 星期三
2 2010-02-01 00:00:00 2010-02-24 00:00:00 4 星期三
3 2010-03-01 00:00:00 2010-03-31 00:00:00 5 星期三
4 2010-04-01 00:00:00 2010-04-28 00:00:00 4 星期三
5 2010-05-01 00:00:00 2010-05-26 00:00:00 4 星期三
6 2010-06-01 00:00:00 2010-06-30 00:00:00 5 星期三
7 2010-07-01 00:00:00 2010-07-28 00:00:00 4 星期三
8 2010-08-01 00:00:00 2010-08-25 00:00:00 4 星期三
9 2010-09-01 00:00:00 2010-09-29 00:00:00 5 星期三
10 2010-10-01 00:00:00 2010-10-27 00:00:00 4 星期三
11 2010-11-01 00:00:00 2010-11-24 00:00:00 4 星期三
12 2010-12-01 00:00:00 2010-12-29 00:00:00 5 星期三

已选择12行。

-- 本月倒数第二个星期三:

select t.id, t.cdate,
week_day_desc(t.cdate,2,4), -- 按照楼主的举例,应该是说这个月的 倒数第1个星期三 的日期是多少
to_char(week_day_desc(t.cdate,2,4),'w'), -- 查看用函数出来的结果是本月第几周
to_char(week_day_desc(t.cdate,2,4),'Day') -- 查看用函数出来的结果是本月的星期几
from t;

ID CDATE WEEK_DAY_DESC(T.CDA TO TO_CHAR(WEEK_DAY_DESC(T.
---------- ------------------- ------------------- -- ------------------------
1 2010-01-01 00:00:00 2010-01-20 00:00:00 3 星期三
2 2010-02-01 00:00:00 2010-02-17 00:00:00 3 星期三
3 2010-03-01 00:00:00 2010-03-24 00:00:00 4 星期三
4 2010-04-01 00:00:00 2010-04-21 00:00:00 3 星期三
5 2010-05-01 00:00:00 2010-05-19 00:00:00 3 星期三
6 2010-06-01 00:00:00 2010-06-23 00:00:00 4 星期三
7 2010-07-01 00:00:00 2010-07-21 00:00:00 3 星期三
8 2010-08-01 00:00:00 2010-08-18 00:00:00 3 星期三
9 2010-09-01 00:00:00 2010-09-22 00:00:00 4 星期三
10 2010-10-01 00:00:00 2010-10-20 00:00:00 3 星期三
11 2010-11-01 00:00:00 2010-11-17 00:00:00 3 星期三
12 2010-12-01 00:00:00 2010-12-22 00:00:00 4 星期三

已选择12行。
luoyoumou 2010-07-22
  • 打赏
  • 举报
回复
-- Oracle 查看本月第几周的星期几

-- 搭建测试环境:

create table t(id number, cdate date);
insert into t(id, cdate) values(1,to_date('2010-01-01','yyyy-mm-dd'));
insert into t(id, cdate) values(2,to_date('2010-02-01','yyyy-mm-dd'));
insert into t(id, cdate) values(3,to_date('2010-03-01','yyyy-mm-dd'));
insert into t(id, cdate) values(4,to_date('2010-04-01','yyyy-mm-dd'));
insert into t(id, cdate) values(5,to_date('2010-05-01','yyyy-mm-dd'));
insert into t(id, cdate) values(6,to_date('2010-06-01','yyyy-mm-dd'));
insert into t(id, cdate) values(7,to_date('2010-07-01','yyyy-mm-dd'));
insert into t(id, cdate) values(8,to_date('2010-08-01','yyyy-mm-dd'));
insert into t(id, cdate) values(9,to_date('2010-09-01','yyyy-mm-dd'));
insert into t(id, cdate) values(10,to_date('2010-10-01','yyyy-mm-dd'));
insert into t(id, cdate) values(11,to_date('2010-11-01','yyyy-mm-dd'));
insert into t(id, cdate) values(12,to_date('2010-12-01','yyyy-mm-dd'));

commit;

---------在存储过程中,我需要得到每个月第三个星期的星期三,该怎么写?刚学oracle,好多不懂,帮帮忙详细点,谢谢!

-- (你原来的意思,函数如下:)

create or replace function week_day_asc(
i_cdate date,
i_week number default 1, -- 本月第几周
i_day number default 1 -- 本月的星期几
)
return date
as
v_cdate date;
v_week number;
begin
v_week := to_char(trunc(last_day(sysdate),'D'),'w');
if i_week >0 and i_week <=5 and i_day>=0 and i_day<=7 then
v_cdate := trunc(trunc(i_cdate,'mm')+3,'D')+i_week*7-7+i_day-1;

if trunc(i_cdate,'mm') <> trunc(v_cdate,'mm') then -- 跨月份啦
v_cdate := null;
end if;
else
v_cdate := null;
end if;
return v_cdate;
end;
/

---------------------------------- 测试 -------------------------------------------
select t.id, t.cdate,
week_day_asc(t.cdate,3,4), -- 第三周的星期三(是第三周的第四天)
to_char(week_day_asc(t.cdate,3,4),'w'), -- 查看用函数出来的结果是本月第几周
to_char(week_day_asc(t.cdate,3,4),'Day') -- 查看用函数出来的结果是本月的星期几
from t;

ID CDATE WEEK_DAY_ASC(T.CDAT TO TO_CHAR(WEEK_DAY_ASC(T.C
---------- ------------------- ------------------- -- ------------------------
1 2010-01-01 00:00:00 2010-01-20 00:00:00 3 星期三
2 2010-02-01 00:00:00 2010-02-17 00:00:00 3 星期三
3 2010-03-01 00:00:00 2010-03-17 00:00:00 3 星期三
4 2010-04-01 00:00:00 2010-04-21 00:00:00 3 星期三
5 2010-05-01 00:00:00 2010-05-19 00:00:00 3 星期三
6 2010-06-01 00:00:00 2010-06-16 00:00:00 3 星期三
7 2010-07-01 00:00:00 2010-07-21 00:00:00 3 星期三
8 2010-08-01 00:00:00 2010-08-18 00:00:00 3 星期三
9 2010-09-01 00:00:00 2010-09-15 00:00:00 3 星期三
10 2010-10-01 00:00:00 2010-10-20 00:00:00 3 星期三
11 2010-11-01 00:00:00 2010-11-17 00:00:00 3 星期三
12 2010-12-01 00:00:00 2010-12-15 00:00:00 3 星期三

已选择12行。

select t.id, t.cdate,
week_day_asc(t.cdate,5,4), -- 第五周的星期三(是第五周的第四天,由于有的月份天数不够,应该有很多空值)
to_char(week_day_asc(t.cdate,5,4),'w'), -- 查看用函数出来的结果是本月第几周
to_char(week_day_asc(t.cdate,5,4),'Day') -- 查看用函数出来的结果是本月的星期几
from t;


ID CDATE WEEK_DAY_ASC(T.CDAT TO TO_CHAR(WEEK_DAY_ASC(T.C
---------- ------------------- ------------------- -- ------------------------
1 2010-01-01 00:00:00
2 2010-02-01 00:00:00
3 2010-03-01 00:00:00 2010-03-31 00:00:00 5 星期三
4 2010-04-01 00:00:00
5 2010-05-01 00:00:00
6 2010-06-01 00:00:00 2010-06-30 00:00:00 5 星期三
7 2010-07-01 00:00:00
8 2010-08-01 00:00:00
9 2010-09-01 00:00:00 2010-09-29 00:00:00 5 星期三
10 2010-10-01 00:00:00
11 2010-11-01 00:00:00
12 2010-12-01 00:00:00 2010-12-29 00:00:00 5 星期三

已选择12行。

--///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

-- 我题目意思搞混了,比如这个月是7月,我要得到7月21号,就是这个月的倒数第2星期的星期三,
-- 如果是8月,则是8月18号。如果是9月,则是9月22号。
-- (你现在的意思,函数如下:)
create or replace function week_day_desc(
i_cdate date,
i_week number default 1, -- 本月的倒数第几周
i_day number default 1 -- 本月的星期几
)
return date
as
v_cdate date;
v_week number;
begin
v_week := to_char(trunc(last_day(sysdate),'D'),'w');
if i_week >0 and i_week <=5 and i_day>=0 and i_day<=7 then
v_cdate := trunc(last_day(i_cdate)-3,'D')-i_week*7+i_day-1;

if trunc(i_cdate,'mm') <> trunc(v_cdate,'mm') then -- 跨月份啦
v_cdate := v_cdate - 7;
end if;
else
v_cdate := null;
end if;
return v_cdate;
end;
/

---------------------------------- 测试 -------------------------------------------

select t.id, t.cdate,
week_day_desc(t.cdate,1,4), -- 按照楼主的举例,应该是说这个月的 倒数第2个星期三 的日期是多少
to_char(week_day_desc(t.cdate,1,4),'w'), -- 查看用函数出来的结果是本月第几周
to_char(week_day_desc(t.cdate,1,4),'Day') -- 查看用函数出来的结果是本月的星期几
from t;


ID CDATE WEEK_DAY_DESC(T.CDA TO TO_CHAR(WEEK_DAY_DESC(T.
---------- ------------------- ------------------- -- ------------------------
1 2010-01-01 00:00:00 2010-01-20 00:00:00 3 星期三
2 2010-02-01 00:00:00 2010-02-17 00:00:00 3 星期三
3 2010-03-01 00:00:00 2010-03-24 00:00:00 4 星期三
4 2010-04-01 00:00:00 2010-04-21 00:00:00 3 星期三
5 2010-05-01 00:00:00 2010-05-19 00:00:00 3 星期三
6 2010-06-01 00:00:00 2010-06-23 00:00:00 4 星期三
7 2010-07-01 00:00:00 2010-07-21 00:00:00 3 星期三
8 2010-08-01 00:00:00 2010-08-18 00:00:00 3 星期三
9 2010-09-01 00:00:00 2010-09-22 00:00:00 4 星期三
10 2010-10-01 00:00:00 2010-10-20 00:00:00 3 星期三
11 2010-11-01 00:00:00 2010-11-17 00:00:00 3 星期三
12 2010-12-01 00:00:00 2010-12-22 00:00:00 4 星期三

已选择12行。
luoyoumou 2010-07-22
  • 打赏
  • 举报
回复
-- Oracle 查看本月第几周的星期几

-- 搭建测试环境:

create table t(id number, cdate date);
insert into t(id, cdate) values(1,to_date('2010-01-01','yyyy-mm-dd'));
insert into t(id, cdate) values(2,to_date('2010-02-01','yyyy-mm-dd'));
insert into t(id, cdate) values(3,to_date('2010-03-01','yyyy-mm-dd'));
insert into t(id, cdate) values(4,to_date('2010-04-01','yyyy-mm-dd'));
insert into t(id, cdate) values(5,to_date('2010-05-01','yyyy-mm-dd'));
insert into t(id, cdate) values(6,to_date('2010-06-01','yyyy-mm-dd'));
insert into t(id, cdate) values(7,to_date('2010-07-01','yyyy-mm-dd'));
insert into t(id, cdate) values(8,to_date('2010-08-01','yyyy-mm-dd'));
insert into t(id, cdate) values(9,to_date('2010-09-01','yyyy-mm-dd'));
insert into t(id, cdate) values(10,to_date('2010-10-01','yyyy-mm-dd'));
insert into t(id, cdate) values(11,to_date('2010-11-01','yyyy-mm-dd'));
insert into t(id, cdate) values(12,to_date('2010-12-01','yyyy-mm-dd'));

commit;


-- (你原来的意思,函数如下:) ---------在存储过程中,我需要得到每个月第三个星期的星期三,该怎么写?刚学oracle,好多不懂,帮帮忙详细点,谢谢!
create or replace function week_day_asc(i_cdate date, i_week number default 1, i_day number default 1)
return date
as
v_cdate date;
v_week number;
begin
v_week := to_char(trunc(last_day(sysdate),'D'),'w');
if i_week >0 and i_week <=5 and i_day>=0 and i_day<=7 then
v_cdate := trunc(trunc(i_cdate,'mm')+3,'D')+i_week*7-7+i_day-1;

if trunc(i_cdate,'mm') <> trunc(v_cdate,'mm') then -- 跨月份啦
v_cdate := v_cdate - 7;
end if;
else
v_cdate := null;
end if;
return v_cdate;
end;
/

---------------------------------- 测试 -------------------------------------------
select t.id, t.cdate,
week_day_asc(t.cdate,3,4), -- 第三周的星期三(是第三周的第四天)
to_char(week_day_asc(t.cdate,3,4),'w'), -- 查看用函数出来的结果是本月第几周
to_char(week_day_asc(t.cdate,3,4),'Day') -- 查看用函数出来的结果是本月的星期几
from t;

ID CDATE WEEK_DAY_ASC(T.CDAT TO TO_CHAR(WEEK_DAY_ASC(T.C
---------- ------------------- ------------------- -- ------------------------
1 2010-01-01 00:00:00 2010-01-20 00:00:00 3 星期三
2 2010-02-01 00:00:00 2010-02-17 00:00:00 3 星期三
3 2010-03-01 00:00:00 2010-03-17 00:00:00 3 星期三
4 2010-04-01 00:00:00 2010-04-21 00:00:00 3 星期三
5 2010-05-01 00:00:00 2010-05-19 00:00:00 3 星期三
6 2010-06-01 00:00:00 2010-06-16 00:00:00 3 星期三
7 2010-07-01 00:00:00 2010-07-21 00:00:00 3 星期三
8 2010-08-01 00:00:00 2010-08-18 00:00:00 3 星期三
9 2010-09-01 00:00:00 2010-09-15 00:00:00 3 星期三
10 2010-10-01 00:00:00 2010-10-20 00:00:00 3 星期三
11 2010-11-01 00:00:00 2010-11-17 00:00:00 3 星期三
12 2010-12-01 00:00:00 2010-12-15 00:00:00 3 星期三

已选择12行。


-- 我题目意思搞混了,比如这个月是7月,我要得到7月21号,就是这个月的倒数第2星期的星期三,
-- 如果是8月,则是8月18号。如果是9月,则是9月22号。
-- (你现在的意思,函数如下:)
create or replace function week_day_desc(i_cdate date, i_week number default 1, i_day number default 1)
return date
as
v_cdate date;
v_week number;
begin
v_week := to_char(trunc(last_day(sysdate),'D'),'w');
if i_week >0 and i_week <=5 and i_day>=0 and i_day<=7 then
v_cdate := trunc(last_day(i_cdate)-3,'D')-i_week*7+i_day-1;

if trunc(i_cdate,'mm') <> trunc(v_cdate,'mm') then -- 跨月份啦
v_cdate := v_cdate - 7;
end if;
else
v_cdate := null;
end if;
return v_cdate;
end;
/

---------------------------------- 测试 -------------------------------------------

select t.id, t.cdate,
week_day_desc(t.cdate,1,4), -- 按照楼主的举例,应该是说这个月的 倒数第2个星期三 的日期是多少
to_char(week_day_desc(t.cdate,1,4),'w'), -- 查看用函数出来的结果是本月第几周
to_char(week_day_desc(t.cdate,1,4),'Day') -- 查看用函数出来的结果是本月的星期几
from t;


ID CDATE WEEK_DAY_DESC(T.CDA TO TO_CHAR(WEEK_DAY_DESC(T.
---------- ------------------- ------------------- -- ------------------------
1 2010-01-01 00:00:00 2010-01-20 00:00:00 3 星期三
2 2010-02-01 00:00:00 2010-02-17 00:00:00 3 星期三
3 2010-03-01 00:00:00 2010-03-24 00:00:00 4 星期三
4 2010-04-01 00:00:00 2010-04-21 00:00:00 3 星期三
5 2010-05-01 00:00:00 2010-05-19 00:00:00 3 星期三
6 2010-06-01 00:00:00 2010-06-23 00:00:00 4 星期三
7 2010-07-01 00:00:00 2010-07-21 00:00:00 3 星期三
8 2010-08-01 00:00:00 2010-08-18 00:00:00 3 星期三
9 2010-09-01 00:00:00 2010-09-22 00:00:00 4 星期三
10 2010-10-01 00:00:00 2010-10-20 00:00:00 3 星期三
11 2010-11-01 00:00:00 2010-11-17 00:00:00 3 星期三
12 2010-12-01 00:00:00 2010-12-22 00:00:00 4 星期三

已选择12行。
jack0603 2010-07-21
  • 打赏
  • 举报
回复

/********临时表创建,并导入2010年1月1日 至 7月1日 日期数据********/
--创建测试表
CREATE TABLE TBL_TEMP_DATETEST(
DEAL_DATE DATE
)
--导入数据
CREATE OR REPLACE PROCEDURE PROC_INSERT_DATE
IS
V_SUMTODAY NUMBER;
V_DAYNUM DATE;
BEGIN
SELECT to_date(to_char(sysdate,'yyyy-mm-dd'),'yyyy-mm-dd')-to_date( '2010-01-01','yyyy-mm-dd') INTO V_SUMTODAY FROM dual;
DBMS_OUTPUT.put_line('SUMTODAY:'||V_SUMTODAY);
LOOP
V_SUMTODAY := V_SUMTODAY - 1;
DBMS_OUTPUT.put_line('SUMTODAY:'||V_SUMTODAY);
IF V_SUMTODAY = 0 THEN
EXIT;
END IF;
SELECT SYSDATE-V_SUMTODAY INTO V_DAYNUM FROM DUAL;
DBMS_OUTPUT.put_line('V_DAYNUM:'||V_DAYNUM);
INSERT INTO TBL_TEMP_DATETEST(DEAL_DATE) VALUES(V_DAYNUM);
END LOOP;
COMMIT;
END PROC_INSERT_DATE;
--执行过程
SQL>set serveroutput on;
SQL>execute PROC_INSERT_DATE;


/*********执行查找 没个月第三周 星期三 的数据**************/
SELECT M1.DEAL_DATE,
M1.AA,
DECODE(M1.BB,'1','第一周','2','第二周','3','第三周','4','第四周','5','第五周')
FROM(
SELECT DEAL_DATE,
TO_CHAR(DEAL_DATE,'DAY') AS "AA",
TO_CHAR(DEAL_DATE,'w') AS "BB"
FROM TBL_TEMP_DATETEST DT) M1
WHERE M1.AA = '星期三' AND M1.BB = 3

--结果显示
2010-1-20 22:51:16 星期三 第三周
2010-2-17 22:51:16 星期三 第三周
2010-3-17 22:51:16 星期三 第三周
2010-4-21 22:51:16 星期三 第三周
2010-5-19 22:51:16 星期三 第三周
2010-6-16 22:51:16 星期三 第三周
2010-1-20 22:52:03 星期三 第三周
2010-2-17 22:52:03 星期三 第三周
2010-3-17 22:52:03 星期三 第三周
2010-4-21 22:52:03 星期三 第三周
2010-5-19 22:52:03 星期三 第三周
2010-6-16 22:52:03 星期三 第三周
2010-1-20 22:52:34 星期三 第三周
2010-2-17 22:52:34 星期三 第三周
2010-3-17 22:52:34 星期三 第三周
2010-4-21 22:52:34 星期三 第三周
2010-5-19 22:52:34 星期三 第三周
2010-6-16 22:52:34 星期三 第三周
luoyoumou 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 tangren 的回复:]
SQL code
SQL> SELECT dd, to_char(dd, 'day')
2 FROM (SELECT dd, row_number() over(PARTITION BY mm ORDER BY dd) rn
3 FROM (SELECT dd, to_char(dd, 'mm') mm
4 FR……
[/Quote]

-- 牛,你这都是每个月的第四个星期的星期三了,呵呵,挺好的....
tangren 2010-07-21
  • 打赏
  • 举报
回复
SQL> SELECT dd, to_char(dd, 'day')
2 FROM (SELECT dd, row_number() over(PARTITION BY mm ORDER BY dd) rn
3 FROM (SELECT dd, to_char(dd, 'mm') mm
4 FROM (SELECT trunc(SYSDATE, 'yyyy') + LEVEL - 1 dd
5 FROM dual
6 CONNECT BY LEVEL <= last_day(add_months(trunc(SYSDATE, 'yyyy'), 11)) -
7 trunc(SYSDATE, 'yyyy') + 1)
8 WHERE to_char(dd, 'd') = 4))
9 WHERE rn = 3;

DD TO_CHAR(DD,'DAY')
----------- -----------------
2010-1-20 星期三
2010-2-17 星期三
2010-3-17 星期三
2010-4-21 星期三
2010-5-19 星期三
2010-6-16 星期三
2010-7-21 星期三
2010-8-18 星期三
2010-9-15 星期三
2010-10-20 星期三
2010-11-17 星期三
2010-12-15 星期三

12 rows selected

SQL>
luoyoumou 2010-07-21
  • 打赏
  • 举报
回复
你这样想:

2010 年 5月 1号是星期六

我加14日,是不是这个月的第三周的星期六、

我再减去星期六 是这周的第7日, 是不是变成本月第二周的最后一天,

最后加上 4 (因为星期3是一周的第4天)

这样不就出来啦?

不管你本月的第一天是星期几嘛.....

sys@SZTYORA> select sysdate from dual;
SYSDATE
-------------------
2010-05-01 22:08:15

sys@SZTYORA> select trunc(sysdate,'mm')+14 - to_char(trunc(sysdate,'mm'),'D') + 4
2 from dual;
TRUNC(SYSDATE,'MM')
-------------------
2010-05-12 00:00:00

sys@SZTYORA> select to_char(sysdate,'D') from dual;
TO
--
7

sys@SZTYORA> select sysdate-7 from dual;
SYSDATE-7
-------------------
2010-04-24 22:09:33

sys@SZTYORA> select sysdate+14-7 from dual;
SYSDATE+14-7
-------------------
2010-05-08 22:09:56

sys@SZTYORA> select trunc(sysdate,'mm')+14 - to_char(trunc(sysdate,'mm'),'D') + 4
2 from dual;
baobeizhu100 2010-07-21
  • 打赏
  • 举报
回复
把当前日期处于当月多少周,周内多少天算出来,然后判断是不是你要的那天,这样简单些

本月第几周
  SQL> Select to_char(sysdate,'W') from dual;
  TO_CHAR(SYSDATE,'W')


周内第几天
  SQL> Select to_char(sysdate,'D') from dual;
  TO_CHAR(SYSDATE,'D')
luoyoumou 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 luoyoumou 的回复:]
SQL code
-- 当前月的第三个星期的星期三
select trunc(sysdate,'mm')+14 - to_char(trunc(sysdate,'mm'),'D') + 4
from dual;
[/Quote]

-- 如果求每个月的话,可以用 每个月的任意一个日期(一般是每月的第一天) 去替换上面两个 sysdate
luoyoumou 2010-07-21
  • 打赏
  • 举报
回复
-- 当前月的第三个星期的星期三
select trunc(sysdate,'mm')+14 - to_char(trunc(sysdate,'mm'),'D') + 4
from dual;
心中的彩虹 2010-07-21
  • 打赏
  • 举报
回复

--这样看是否
SQL> select to_char(sysdate,'day') from dual;

TO_CHAR(S
---------
星期三

simple1986_2008 2010-07-21
  • 打赏
  • 举报
回复
select to_char(sysdate,'d') day_of_week ,to_char(sysdate,'w') week_of_month from dual ;

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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