ORACLE计算一年中周内个日期的次数

本文介绍了一种使用Oracle SQL的方法来统计一年中每一天(星期日到星期六)出现的次数。通过创建临时表并利用系统日期函数实现了这一目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

思路大致如下:

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.

### 回答1: 假设有一组数据 $x_1, x_2, ..., x_n$,其均值方差分别为 $\mu_n$ $\sigma^2_n$,现在要求加入一个新数据 $x_{n+1}$,则可以使用以下递推公式计算新的均值方差: $$\mu_{n+1}=\frac{n\mu_n+x_{n+1}}{n+1}$$ $$\sigma^2_{n+1}=\frac{n\sigma^2_n+(x_{n+1}-\mu_n)(x_{n+1}-\mu_{n+1})}{n+1}$$ 其中,$\mu_{n+1}$ 表示加入新数据后的均值,$\sigma^2_{n+1}$ 表示加入新数据后的方差,$n$ 为已有数据的数量。 ### 回答2: MATLAB可以通过递推公式计算均值方差。具体实现如下: 1. 均值的递推公式: 要计算一组数据均值,可以使用以下递推公式: μ_n = μ_{n-1} + (x_n - μ_{n-1}) / n 其中,μ_n表示前n个数据均值,x_n表示第n个数据,n表示数据的总个数。初始时,μ_0为0。通过不断更新μ_n的值,最终得到整组数据均值。 2. 方差的递推公式: 要计算一组数据方差,可以使用以下递推公式: σ^2_n = ((n-1) * σ^2_{n-1} + (x_n - μ_{n-1})^2) / n 其中,σ^2_n表示前n个数据方差,x_n表示第n个数据,μ_{n-1}表示前n-1个数据均值,σ^2_{n-1}表示前n-1个数据方差,n表示数据的总个数。初始时,σ^2_0为0。通过不断更新σ^2_n的值,最终得到整组数据方差。 在MATLAB中,可以使用循环结构来依次读入数据更新均值方差的值。首先设置初始的均值方差为0,然后根据上述递推公式,在每次循环中更新均值方差的值。最后计算得到整组数据均值方差。这样就实现了均值方差的递推公式的计算。 以上是MATLAB实现均值方差的递推公式的方法,通过这种方式可以方便地计算一组数据均值方差。 ### 回答3: MATLAB可以通过使用递推公式来计算均值(Mean)方差(Variance),以下是两个基本的递推公式的实现方法。 首先,计算均值的递推公式如下: 1. 声明一个变量sum来保存所有数据点的累加,并初始化为0。 2. 声明一个变量count来保存已处理的数据点数目,并初始化为0。 3. 使用循环结构遍历所有数据点,将数据点的值加到sum中,并将count加1。 4. 最终,均值的计算公式为mean = sum / count。 下面是用MATLAB代码实现的例子: sum = 0; % 初始化累加为0 count = 0; % 初始化数据点数目为0 for i = 1:length(data) sum = sum + data(i); % 将数据点的值加到累加中 count = count + 1; % 增加数据点数目 end mean = sum / count; % 计算均值 接下来,计算方差的递推公式如下: 1. 声明一个变量sum_sq来保存所有数据点的平方,并初始化为0。 2. 使用循环结构遍历所有数据点,将数据点的平方加到sum_sq中。 3. 最终,方差的计算公式为variance = (sum_sq - sum^2 / count) / (count - 1)。 下面是用MATLAB代码实现的例子: sum_sq = 0; % 初始化平方为0 for i = 1:length(data) sum_sq = sum_sq + data(i)^2; % 将数据点的平方加到平方中 end variance = (sum_sq - sum^2 / count) / (count - 1); % 计算方差 通过这些递推公式,MATLAB可以很方便地计算均值方差。在计算过程中,需要使用循环结构来遍历所有数据点,并逐步更新累加平方。最终,根据公式计算出均值方差的数值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值