`

利用伪列算出每个月那几天是星期天(ORACLE)

阅读更多
1.首先我们要用到LEVEL .... CONNECT BY
level是一个伪列,类似于rownum,而后面加connect by则可以构造出一个循环来;

例如:
SQL>select level from dual connect by level<=5;
结果
-----------------------------------------------
LEVEL
  1
  2
  3
  4
  5

一个伪列并循环显示就这样产生了.

2.接着我要构造出一个日期的伪列出来,需要用到日期函数,比如现在是12月,我需要构造出来2007年12月1日----2007年12月31日的伪列.

SQL>select last_day(sysdate) from dual;

结果
-----------------------------------------------
1       2007-12-31 1:22:24

SQL>select to_char(last_day(sysdate),'DD') from dual;

结果
-----------------------------------------------
1       31

SQL>select level from dual connect by level<=to_char(last_day(sysdate),'DD');

结果
-----------------------------------------------
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
11 11
12 12
13 13
14 14
15 15
16 16
17 17
18 18
19 19
20 20
21 21
22 22
23 23
24 24
25 25
26 26
27 27
28 28
29 29
30 30
31 31

SQL>select TRUNC(SYSDATE,'MM') from dual;

结果
-----------------------------------------------
1       2007-12-1

接着我们要做的事情就是把上面的函数结合起来实现2007年12月1日----2007年12月31日的伪列

SQL>select TRUNC(SYSDATE,'MM')-1+level from dual connect by level<=to_char(last_day(sysdate),'DD');

结果
-----------------------------------------------
1 2007-12-1
2 2007-12-2
3 2007-12-3
4 2007-12-4
5 2007-12-5
6 2007-12-6
7 2007-12-7
8 2007-12-8
9 2007-12-9
10 2007-12-10
11 2007-12-11
12 2007-12-12
13 2007-12-13
14 2007-12-14
15 2007-12-15
16 2007-12-16
17 2007-12-17
18 2007-12-18
19 2007-12-19
20 2007-12-20
21 2007-12-21
22 2007-12-22
23 2007-12-23
24 2007-12-24
25 2007-12-25
26 2007-12-26
27 2007-12-27
28 2007-12-28
29 2007-12-29
30 2007-12-30
31 2007-12-31

3.构造出日期伪列后,我们只需要加上一个where条件既可以查询出这个月的星期日都是几号了

SQL>select to_char(sysdate,'DAY') from dual;

结果
-----------------------------------------------
1 星期六

SQL>select TRUNC(SYSDATE,'MM')-1+level from dual
SQL>where to_char(TRUNC(SYSDATE,'MM')-1+level,'DAY') = '星期日'
SQL>connect by level<=to_char(last_day(sysdate),'DD');

结果
-----------------------------------------------
1 2007-12-2
2 2007-12-9
3 2007-12-16
4 2007-12-23
5 2007-12-30

也可以把sql语句换成

SQL>select TRUNC(SYSDATE,'MM')-1+level from dual
SQL>where to_char(TRUNC(SYSDATE,'MM')-1+level,'D') = 1
SQL>connect by level<=to_char(last_day(sysdate),'DD');
1.首先我们要用到LEVEL .... CONNECT BY
level是一个伪列,类似于rownum,而后面加connect by则可以构造出一个循环来;

例如:
SQL>select level from dual connect by level<=5;
结果
-----------------------------------------------
LEVEL
  1
  2
  3
  4
  5

一个伪列并循环显示就这样产生了.

2.接着我要构造出一个日期的伪列出来,需要用到日期函数,比如现在是12月,我需要构造出来2007年12月1日----2007年12月31日的伪列.

SQL>select last_day(sysdate) from dual;

结果
-----------------------------------------------
1       2007-12-31 1:22:24

SQL>select to_char(last_day(sysdate),'DD') from dual;

结果
-----------------------------------------------
1       31

SQL>select level from dual connect by level<=to_char(last_day(sysdate),'DD');

结果
-----------------------------------------------
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
11 11
12 12
13 13
14 14
15 15
16 16
17 17
18 18
19 19
20 20
21 21
22 22
23 23
24 24
25 25
26 26
27 27
28 28
29 29
30 30
31 31

SQL>select TRUNC(SYSDATE,'MM') from dual;

结果
-----------------------------------------------
1       2007-12-1

接着我们要做的事情就是把上面的函数结合起来实现2007年12月1日----2007年12月31日的伪列

SQL>select TRUNC(SYSDATE,'MM')-1+level from dual connect by level<=to_char(last_day(sysdate),'DD');

结果
-----------------------------------------------
1 2007-12-1
2 2007-12-2
3 2007-12-3
4 2007-12-4
5 2007-12-5
6 2007-12-6
7 2007-12-7
8 2007-12-8
9 2007-12-9
10 2007-12-10
11 2007-12-11
12 2007-12-12
13 2007-12-13
14 2007-12-14
15 2007-12-15
16 2007-12-16
17 2007-12-17
18 2007-12-18
19 2007-12-19
20 2007-12-20
21 2007-12-21
22 2007-12-22
23 2007-12-23
24 2007-12-24
25 2007-12-25
26 2007-12-26
27 2007-12-27
28 2007-12-28
29 2007-12-29
30 2007-12-30
31 2007-12-31

3.构造出日期伪列后,我们只需要加上一个where条件既可以查询出这个月的星期日都是几号了

SQL>select to_char(sysdate,'DAY') from dual;

结果
-----------------------------------------------
1 星期六

SQL>select TRUNC(SYSDATE,'MM')-1+level from dual
SQL>where to_char(TRUNC(SYSDATE,'MM')-1+level,'DAY') = '星期日'
SQL>connect by level<=to_char(last_day(sysdate),'DD');

结果
-----------------------------------------------
1 2007-12-2
2 2007-12-9
3 2007-12-16
4 2007-12-23
5 2007-12-30

也可以把sql语句换成

SQL>select TRUNC(SYSDATE,'MM')-1+level from dual
SQL>where to_char(TRUNC(SYSDATE,'MM')-1+level,'D') = 1
SQL>connect by level<=to_char(last_day(sysdate),'DD');

结果
-----------------------------------------------
1 2007-12-2
2 2007-12-9
3 2007-12-16
4 2007-12-23
5 2007-12-30

数字1-7分别代表星期天到星期六;
OK到此分析完毕,Oracle的伪列的功能还是很不错的呀!~呵呵

结果
-----------------------------------------------
1 2007-12-2
2 2007-12-9
3 2007-12-16
4 2007-12-23
5 2007-12-30

数字1-7分别代表星期天到星期六;
OK到此分析完毕,Oracle的伪列的功能还是很不错的呀!~呵呵
分享到:
评论

相关推荐

    oracle数据库伪列简单介绍

    **rowid** 也是Oracle数据库中的一个重要伪列,它表示表中每行记录的物理地址。与rownum不同的是,rowid对于表中的每一行都是唯一的,并且指向该行数据的实际存储位置。 ##### rowid的特点: 1. **唯一性**:rowid...

    oracle的伪列与分页

    - **定义**:ROWID是Oracle中用于唯一标识表中每一行记录的一个伪列。 - **特性**: - 每个表的每一行都有一个唯一的ROWID值。 - ROWID包含行的实际物理地址。 - 使用ROWID可以快速定位到具体的一行记录,从而...

    oracle伪列以及伪表.doc

    1. CURRVAL 和 NEXTVAL:这两个伪列与序列号相关,CURRVAL返回序列的当前值,而NEXTVAL则递增序列并返回新值。 2. LEVEL:在递归查询或层次查询中,LEVEL伪列用来表示数据在树形结构中的深度或层级。 3. ROWID:这...

    oracle伪列以及伪表.docx

    Oracle数据库系统中,伪列和伪表是两个特殊的概念,它们为数据库操作提供了额外的功能和便利。本文将详细探讨这两个概念及其应用场景。 首先,我们来理解什么是伪列。伪列并非用户在创建表时定义的列,而是Oracle...

    oracle伪列以与伪表.doc

    1. `CURRVAL` 和 `NEXTVAL`:这两个伪列与Oracle序列有关。`CURRVAL`返回序列的当前值,而`NEXTVAL`则递增序列并返回新的值。它们通常用于生成唯一的标识符,如主键。 2. `LEVEL`:在查询层次结构数据时,`LEVEL`伪...

    ORACLE sql 星期几 一个月的第几天等 方法

    在这个资源中,我们将讨论如何使用 Oracle SQL 来获取星期几、一个月的第几天、一个年的第几天等信息。 一、获取星期几 Oracle SQL 提供了多种方式来获取星期几,下面是一些常见的方法: 1. 使用 TO_CHAR 函数 ...

    17.Oracle伪列1

    【Oracle伪列详解】 在Oracle数据库中,伪...理解并熟练运用这两个伪列,对于优化查询性能和实现数据管理功能具有重要意义。在实际应用中,需要注意其特性,避免因为rowid的局限性而影响程序的移植性和数据的稳定性。

    Oracle行转列(不定列)

    本篇文章将详细探讨Oracle如何实现行转列为列的过程,以及在面对不确定列数时的解决方案。 在传统的SQL查询中,数据通常是以行的形式存储和展示。然而,在某些场景下,我们可能需要将同一类别的数据从多行转换为一...

    oracle 伪列以及伪行

    NULL 博文链接:https://mxm910821.iteye.com/blog/1470832

    ORA_ROWSCN伪列在Oracle历史数据迁移中的应用研究.pdf

    ORA_ROWSCN伪列在Oracle历史数据迁移中的应用研究 Oracle数据库系统中,数据迁移是不可避免的,特别是在大型企业中,数据库系统的数据量会随着时间的推移不断增长。为了解决这个问题,Oracle提供了多种数据迁移...

    oracle动态行转列

    然后,动态构建SQL语句,对于每个不同的日期,使用`DECODE`函数将行数据转换为指定列的数据。最后,执行`EXECUTE IMMEDIATE V_SQL`来创建一个视图`RESULT`,该视图包含了转换后的数据集。 #### 3. DECODE函数的作用...

    Oracle行转列之pivot

    例如,如果有一个员工表(emp),其中包含部门号(deptno)、职位(job)和薪水(sal),行转列操作可以通过聚合函数(如SUM)对每个部门和职位的薪水进行求和,并将每个部门的求和结果转换为独立的列。 PIVOT操作...

    ORACLE根据某一列的值修改另一列的值

    Oracle 数据库开发培训中根据某一列的值修改另一列的值 Oracle 数据库是一种关系型数据库管理系统,广泛应用于企业级应用程序中。在 Oracle 数据库中,我们可以使用 update 语句来修改某一列的值根据另一列的值。...

    Oracle sql查询当前月的所有日期

    - **`TRUNC(SYSDATE, 'MM') + ROWNUM - 1`**:这里使用了`TRUNC`函数获取当前月份的第一天,然后通过`ROWNUM`动态生成从1到当前月份天数的序列,并计算出每一天的具体日期。 - **`FROM DUAL`**:这是一个特殊的表,...

    oracle行转列

    例如,假设有一个销售数据表,包含产品ID、年份和销售额三个字段,我们可以通过PIVOT操作将不同年份的销售额转换为对应的列,使得每个产品对应一行,各年的销售额作为列显示。 ```sql SELECT * FROM 销售数据 PIVOT...

    oracle查询一个月之内数据

    根据提供的标题、描述、标签及部分内容,我们可以了解到本篇文章主要关注的是如何在Oracle数据库中查询一个月内的数据。这里的关键在于日期范围的确定以及如何利用Oracle的内置函数来完成这一任务。接下来,我们将...

    oracle 行转列

    例如,一个销售数据表可能包含产品ID、销售日期和销售额三列,如果想要按产品查看每个月的销售额,行转列就能将不同月份的销售额显示在同一行的不同列中。 Oracle的PIVOT功能是实现这一转换的关键。基本语法如下: ...

    oracle查询表的所有列并用逗号隔开

    在Oracle数据库环境中,有时我们需要获取一个表的所有列名,并且以特定格式(如逗号分隔)输出这些列名。这种需求通常出现在多种场景中,比如动态SQL构建、数据迁移或者系统日志记录等。本篇文章将详细介绍如何在...

    2-ORACLE伪列&场景判断.sql

    2-ORACLE伪列&场景判断.sql

Global site tag (gtag.js) - Google Analytics