oracle计算一年发生次数,ORACLE计算一年中周内个日期的次数

说白了就是计算一年中有多少个星期日,多少个星期一,多少个星期二……

思路大致如下:

1、生成一年内的所有日期

2、设置日期格式,得到每个日期对应为星期几。

3、计算周内日期分别有多少个。

SQL> with x as

2  (

3  select level lvl from dual

4  connect by level<=(add_months(trunc(sysdate,'y'),12)-trunc(sysdate,'y'))

5  )

6  select to_char(trunc(sysdate,'y')+lvl-1,'DAY'),count(*)

7  from x

8  group by to_char(trunc(sysdate,'y')+lvl-1,'DAY');

TO_CHAR(TRUNC(SYSDATE,'Y')+   COUNT(*)

--------------------------- ----------

THURSDAY                            53

SATURDAY                            52

TUESDAY                             52

SUNDAY                              52

WEDNESDAY                           52

MONDAY                              52

FRIDAY                              52

7 rows selected.

注意,在这里level的列别名lvl是必须的,如果不加的话会出错。

SQL> with x as

2  (

3  select level from dual

4  connect by level<=(add_months(trunc(sysdate,'y'),12)-trunc(sysdate,'y'))

5  )

6  select to_char(trunc(sysdate,'y')+level-1,'DAY'),count(*)

7  from x

8  group by to_char(trunc(sysdate,'y')+level-1,'DAY');

from x

*

ERROR at line 7:

ORA-01788: CONNECT BY clause required in this query block

这个时候在第六行和第八行中的level系统会认为是下面这个select的,而不是上面select中的level,因此提示缺失connect by子句。

如果是oracle8i或较早的版本,不能使用connect by的话,可是通过基干表来完成相关内容。

SQL> create table t500(id number);

Table created.

SQL> begin

2  for i in 1..500 loop

3  insert into t500 values(i);

4  end loop;

5  end;

6  /

PL/SQL procedure successfully completed.

SQL> select id from t500 where rownum<10;  --验证一下看数据插入到表中没有

ID

----------

1

2

3

4

5

6

7

8

9

9 rows selected.

SQL> select to_char(trunc(sysdate,'y')+rownum-1,'DAY'),count(*)

2  from t500

3  where rownum<=(add_months(trunc(sysdate,'y'),12)-trunc(sysdate,'y'))

4  group by to_char(trunc(sysdate,'y')+rownum-1,'DAY');

TO_CHAR(TRUNC(SYSDATE,'Y')+   COUNT(*)

--------------------------- ----------

THURSDAY                            53

SATURDAY                            52

TUESDAY                             52

SUNDAY                              52

WEDNESDAY                           52

MONDAY                              52

FRIDAY                              52

7 rows selected.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值