`

(原)Oracle 获取每周的起始日期

 
阅读更多

Oracle 获取每周的起始日期

 

代码如下,后面解释:

 

select dateTime begin_day, dateTime+6 end_day, rn+1 rn from
(
  select dateTime, Rownum rn from 
  (
    select trunc(sysdate, 'yyyy')+rownum-1 dateTime from dba_objects 
    where rownum <= (select add_months(trunc(sysdate, 'yyyy'), 12) - trunc(sysdate, 'yyyy') from dual)
  ) b where to_char(b.dateTime, 'day') = '星期一'
)

 

 

说明:

dba_objects 表:
只是被借用了一下,而不是用来查询里面内容用的。 
这个表的真正意义在于 —— 它提供了可以罗列多条数据的可能。 由于每年都有 365 or 366 天,
因此,我们需要一个可以罗列出 356 or 366 条记录的表。这个表可以被替换,但前提是该表里至少有
366条数据(为何定在366而不是365条,请自己去体会)。

trunc() 函数 和 to_char()函数:不清楚的去百度查查就行,例子和说明很多

 

注意:

这条语句查询出来后,可能第一个星期并不是从1月1日开始的。
这是正常的现象,因为在没有设置的情况下,Oracle沿用的是默认的星期设置。
如需使用自己定义的规则,诸如 “1月1日为每年第一周,12月31日为每年的最后一周” 这样的规则,
需要额外处理一下1月1日和12月31日这两个日期节点。

 

自定义日期规则的处理:

因为需要,我们需要用到下面这个规则:
1月1日为每年第一周,12月31日为每年的最后一周

提示:
如需使用上面的规则,需要对下面情况进行处理

情况一: 1月1日 = 星期一 && 12月31日 = 星期日 
这是最理想的情况,虽然这种情况我还看到过, 为了严谨,也写到代码中了,代码如下:
select dateTime begin_day, dateTime+6 end_day, rn from
(
  select dateTime, Rownum rn from 
  (
    select trunc(sysdate, 'yyyy')+rownum-1 dateTime from dba_objects 
    where rownum <= (select add_months(trunc(sysdate, 'yyyy'), 12) - trunc(sysdate, 'yyyy') from dual)
  ) b where to_char(b.dateTime, 'day') = '星期一'
) 

情况二: 1月1日 = 星期一 && 12月31日 <> 星期日 
对于这种情况需要对最后一周做些处理,然后在 union 到拼接即可

1. 获取本年度共有多少个星期
select to_char(add_months(trunc(sysdate, 'yyyy'), 12)-1, 'fmww') into n_totalWeeks from dual;

2. 获取倒数第二周的结束日期
select dateTime+6 end_day into d_endDate from
(
  select dateTime, Rownum rn from 
  (
    select trunc(sysdate, 'yyyy')+rownum-1 dateTime from dba_objects 
    where rownum <= (select add_months(trunc(sysdate, 'yyyy'), 12) - trunc(sysdate, 'yyyy') from dual)
  ) b where to_char(b.dateTime, 'day') = '星期一'
) where rn = n_totalWeeks-1;

3. 最后一周的SQL代码如下:
select d_endDate+1 begin_day, add_months(trunc(sysdate, 'yyyy'), 12)-1 end_day, rn n_totalWeeks from dual;

4. 拼接SQL:
select dateTime begin_day, dateTime+6 end_day, rn from
(
  select dateTime, Rownum rn from 
  (
    select trunc(sysdate, 'yyyy')+rownum-1 dateTime from dba_objects 
    where rownum <= (select add_months(trunc(sysdate, 'yyyy'), 12) - trunc(sysdate, 'yyyy') from dual)
  ) b where to_char(b.dateTime, 'day') = '星期一'
) where rn <= n_totalWeeks-1
union
select d_endDate+1 begin_day, add_months(trunc(sysdate, 'yyyy'), 12)-1 end_day, rn n_totalWeeks from dual;

情况三: 1月1日 <> 星期一 && 12月31日 = 星期日
这种情况跟情况二类似,思路和一样,不同之处在于这个需要将1月1日所在的周设置为第一周

1. 获取今年总的星期数:
select to_char(add_months(trunc(sysdate, 'yyyy'), 12)-1, 'fmww') into n_totalWeeks from dual;

2. 获取第二周的开始日期
select dateTime begin_day into d_beginDate from
(
  select dateTime, Rownum rn+1 rn from 
  (
    select trunc(sysdate, 'yyyy')+rownum-1 dateTime from dba_objects 
    where rownum <= (select add_months(trunc(sysdate, 'yyyy'), 12) - trunc(sysdate, 'yyyy') from dual)
  ) b where to_char(b.dateTime, 'day') = '星期一'
) where rn = 2;

3. 第一周的SQL如下:
select trunc(sysdate, 'yyyy') begin_day, d_beginDate-1 end_day, 1 rn from dual;

4. 拼接完整的SQL:
select trunc(sysdate, 'yyyy') begin_day, d_beginDate-1 end_day, 1 rn from dual
union
select dateTime begin_day, dateTime+6 end_day, rn from
(
  select dateTime, Rownum rn+1 rn from 
  (
    select trunc(sysdate, 'yyyy')+rownum-1 dateTime from dba_objects 
    where rownum <= (select add_months(trunc(sysdate, 'yyyy'), 12) - trunc(sysdate, 'yyyy') from dual)
  ) b where to_char(b.dateTime, 'day') = '星期一'
);

情况四: 1月1日 <> 星期一 && 12月31日 <> 星期日
思路跟前面一样,但是需要对第一周和最后一周分别做处理

1. 获取本年的星期总数:
select to_char(add_months(trunc(sysdate, 'yyyy'), 12), 'fmww')-1 into n_totalWeeks from dual;

2. 获取第二周的开始日期:
select dateTime begin_day into d_beginDate from
(
  select dateTime, Rownum rn+1 rn from 
  (
    select trunc(sysdate, 'yyyy')+rownum-1 dateTime from dba_objects 
    where rownum <= (select add_months(trunc(sysdate, 'yyyy'), 12) - trunc(sysdate, 'yyyy') from dual)
  ) b where to_char(b.dateTime, 'day') = '星期一'
) where rn = 2;

3. 获取倒数第二周的结束日期:
-- 虽然1月1日不是星期一,但oracle默认1月1日为第一周,又因为1月1日不是星期一,所以在查询出来的结果其实是从第二周开始的,
-- 这样在rn不+1的情况下,需要获取倒数第三周的起始日期;
-- rn + 1 的话,就去倒数第二周的起始日期
select dateTime+6 end_day into d_endDate from
(
  select dateTime, Rownum rn+1 rn from 
  (
    select trunc(sysdate, 'yyyy')+rownum-1 dateTime from dba_objects 
    where rownum <= (select add_months(trunc(sysdate, 'yyyy'), 12) - trunc(sysdate, 'yyyy') from dual)
  ) b where to_char(b.dateTime, 'day') = '星期一'
) where rn = n_totalWeeks-1;

4. 第一周的起始日期SQL:
select trunc(sysdate, 'yyyy') begin_day, d_beginDate-1 end_day, 1 rn from dual;

5. 最后一周的起始日期SQL:
select d_endDate+1 begin_day, add_months(trunc(sysdate, 'yyyy'), 12)-1 end_day, rn n_totalWeeks from dual;

6. 拼装后的SQL:
select trunc(sysdate, 'yyyy') begin_day, d_beginDate-1 end_day, 1 rn from dual
union
select dateTime begin_day, dateTime+6 end_day, rn from
(
  select dateTime, Rownum+1 rn from 
  (
    select trunc(sysdate, 'yyyy')+rownum-1 dateTime from dba_objects 
    where rownum <= (select add_months(trunc(sysdate, 'yyyy'), 12) - trunc(sysdate, 'yyyy') from dual)
  ) b where to_char(b.dateTime, 'day') = '星期一'
) where rn <= n_totalWeeks-2
unon
select d_endDate+1 begin_day, add_months(trunc(sysdate, 'yyyy'), 12)-1 end_day, rn n_totalWeeks from dual;

 

注意: 代码中 n_totalWeeks、d_beginDate、d_endDate 均为自定义变量。

 

 

 

 

分享到:
评论

相关推荐

    oracle获取汉字拼音和拼音首字母的功能函数

    在Oracle数据库中,处理汉字和拼音的场景时,有时我们需要获取汉字的拼音或者拼音首字母。这在构建中文搜索引擎、数据分析或报表展示等场景中非常有用。Oracle提供了一些内置的功能函数,可以用来实现这些需求。以下...

    oracle 获取用户ddl脚本

    oracle 获取用户ddl脚本,可获取用户ddl,在sqlplus 工具中打开

    Oracle获取系统日期日期转换函数.docx

    在Oracle数据库中,日期处理是常见的操作,包括获取系统日期和进行日期转换。本文将详细介绍Oracle中的日期函数,包括SYSDATE、TO_CHAR、TO_DATE和TO_NUMBER等,并阐述它们的使用方法和格式化规则。 首先,Oracle...

    Oracle获取系统日期日期转换函数.pdf

    Oracle数据库系统提供了丰富的日期处理和转换函数,其中SYSDATE()函数用于获取系统当前日期和时间,而TO_CHAR()和TO_DATE()函数则用于日期和字符串之间的转换。在Oracle中,日期和时间的格式化是通过指定特定的模式...

    Oracle 验证是否是日期

    ### Oracle 验证是否是日期 在Oracle数据库中,经常需要对输入的数据进行格式校验,尤其是日期格式的校验尤为重要。本文将详细介绍一个自定义的Oracle函数`FN_ISDATE_JAVA`,该函数用于判断给定的字符串是否能够...

    Oracle 获得某日期属于一年中的第几个自然周

    标题“Oracle 获取某日期属于一年中的第几个自然周”指的是在Oracle数据库系统中,通过SQL查询来确定一个特定日期在当年是第几周的问题。在实际业务中,这样的功能可能用于统计、报告或者数据分析,例如,公司可能...

    oracle日期查询相关

    在Oracle数据库中,可以通过`SYSDATE`函数来获取系统的当前日期和时间。这是一个非常实用的功能,尤其是在需要记录数据的操作时间点时。 **示例:** ```sql SELECT SYSDATE FROM DUAL; ``` 这条SQL语句将返回当前的...

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

    在Oracle数据库环境中,进行日期相关的查询是常见的需求之一。例如,有时我们需要获取当前月份的所有日期,这对于财务报表、数据统计等应用场景尤为重要。本文将详细解释如何通过Oracle SQL语句实现这一功能,并对...

    Oracle 查询两个日期之间的所有月份

    Oracle 查询两个日期之间的所有月份

    Java中用Calendar类计算周和周的起始日期

    在计算周的起始日期时,需要了解 getFirstDayOfWeek() 方法,该方法用于获取给定日期所在周的第一天。该方法首先将日期设置到 Calendar 对象中,然后使用 set() 方法将日期设置为星期一,然后使用 getTime() 方法...

    oracle存储过程+日期+定时任务Job

    这些自定义函数未在示例代码中给出,但通常会根据 Oracle 的日期处理规则来实现,例如将周一作为每周的第一天。 #### 四、定时任务 Job 在 Oracle 中,可以使用 `DBMS_SCHEDULER` 包来创建定时任务,以自动调用...

    oracle sql 根据年份、周数取日期

    在Oracle SQL中,根据年份和周数获取特定日期是一个常见的需求,特别是在处理时间序列数据或进行周期性分析时。本文将深入探讨如何利用Oracle SQL的功能来实现这一目标,包括理解Oracle中的日期函数、如何计算特定...

    oracle 自定义方法 判断日期是不是为假期 如果是假期则取下一天 直到工作日爲止

    oracle 自定义方法 判断日期是不是为假期 如果是假期则取下一天 直到工作日爲止

    oracle日历转化成农历

    Oracle数据库系统提供了强大的日期处理功能,其中包括将公历(阳历)日期转换为农历日期。在Oracle中,虽然没有内置的直接转换函数来实现这一功能,但可以通过自定义函数或者利用现有的开源存储过程来实现这一转换。...

    oracle函数得到下一个法定工作日期

    在Oracle数据库中,获取下一个法定工作日期是一个常见的需求,尤其在进行日程安排或业务处理时。本篇文章将深入探讨如何使用Oracle内置函数以及自定义函数来实现这一功能。我们将结合具体的代码示例来理解这一过程。...

    Oracle获取用户下所有表名 获取表所有的列名及数据类型.txt

    Oracle获取用户下所有表名 获取表所有的列名及数据类型 两个SQL查询语句

    Oracle获取系统时间及格式化

    Oracle 中获取系统时间可以使用 SYSDATE() 函数,该函数可以返回当前日期和时间。SYSDATE() 函数可以与 TO_CHAR() 函数结合使用,以将日期和时间格式化为字符串。 TO_CHAR() 函数可以将日期、数字或字符串转换为...

    oracle_日期_加减方法

    - `SYSDATE`:获取系统当前日期和时间。 4. **日期与数字相加**: - Oracle允许日期与数字直接相加减,这是因为日期类型可以隐式转换为天数,数字则被视为天数的倍数。 5. **日期之间的比较**: - 日期可以直接...

    oracle获取汉字拼音首字母

    ### Oracle 获取汉字拼音首字母 在Oracle数据库中实现获取汉字拼音首字母的需求,通常涉及到对中文字符的处理以及拼音转换的技术。这样的功能可以应用于多种场景,例如数据排序、索引建立或是快速检索等。本文将...

    Oracle中的日期处理总结

    在Oracle数据库中,我们可以通过多种方式来获取系统的当前日期或时间。 1. **`SYSDATE`**:使用`SELECT SYSDATE FROM DUAL;`语句可以查询到当前系统的时间。这里的`DUAL`是一个特殊的表,用于返回单行数据,是执行...

Global site tag (gtag.js) - Google Analytics