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数据库本身并不内置农历日期转换的功能,但通过创建自定义函数和使用特定的算法,可以实现从农历到阳历的转换。以下是一个基于给定文件中的方法来解决这个问题的详细步骤: 1. 创建年份编码表 首先,我们需要...
oracle 获取用户ddl脚本,可获取用户ddl,在sqlplus 工具中打开
在Oracle数据库中,日期处理是常见的操作,包括获取系统日期和进行日期转换。本文将详细介绍Oracle中的日期函数,包括SYSDATE、TO_CHAR、TO_DATE和TO_NUMBER等,并阐述它们的使用方法和格式化规则。 首先,Oracle...
Oracle数据库系统提供了丰富的日期处理和转换函数,其中SYSDATE()函数用于获取系统当前日期和时间,而TO_CHAR()和TO_DATE()函数则用于日期和字符串之间的转换。在Oracle中,日期和时间的格式化是通过指定特定的模式...
### Oracle 验证是否是日期 在Oracle数据库中,经常需要对输入的数据进行格式校验,尤其是日期格式的校验尤为重要。本文将详细介绍一个自定义的Oracle函数`FN_ISDATE_JAVA`,该函数用于判断给定的字符串是否能够...
标题“Oracle 获取某日期属于一年中的第几个自然周”指的是在Oracle数据库系统中,通过SQL查询来确定一个特定日期在当年是第几周的问题。在实际业务中,这样的功能可能用于统计、报告或者数据分析,例如,公司可能...
### Oracle 获取汉字拼音首字母 在Oracle数据库中实现获取汉字拼音首字母的需求,通常涉及到对中文字符的处理以及拼音转换的技术。这样的功能可以应用于多种场景,例如数据排序、索引建立或是快速检索等。本文将...
在Oracle数据库中,可以通过`SYSDATE`函数来获取系统的当前日期和时间。这是一个非常实用的功能,尤其是在需要记录数据的操作时间点时。 **示例:** ```sql SELECT SYSDATE FROM DUAL; ``` 这条SQL语句将返回当前的...
在Oracle数据库环境中,进行日期相关的查询是常见的需求之一。例如,有时我们需要获取当前月份的所有日期,这对于财务报表、数据统计等应用场景尤为重要。本文将详细解释如何通过Oracle SQL语句实现这一功能,并对...
Oracle 查询两个日期之间的所有月份
在计算周的起始日期时,需要了解 getFirstDayOfWeek() 方法,该方法用于获取给定日期所在周的第一天。该方法首先将日期设置到 Calendar 对象中,然后使用 set() 方法将日期设置为星期一,然后使用 getTime() 方法...
这些自定义函数未在示例代码中给出,但通常会根据 Oracle 的日期处理规则来实现,例如将周一作为每周的第一天。 #### 四、定时任务 Job 在 Oracle 中,可以使用 `DBMS_SCHEDULER` 包来创建定时任务,以自动调用...
在Oracle SQL中,根据年份和周数获取特定日期是一个常见的需求,特别是在处理时间序列数据或进行周期性分析时。本文将深入探讨如何利用Oracle SQL的功能来实现这一目标,包括理解Oracle中的日期函数、如何计算特定...
oracle 自定义方法 判断日期是不是为假期 如果是假期则取下一天 直到工作日爲止
Oracle数据库系统提供了强大的日期处理功能,其中包括将公历(阳历)日期转换为农历日期。在Oracle中,虽然没有内置的直接转换函数来实现这一功能,但可以通过自定义函数或者利用现有的开源存储过程来实现这一转换。...
Oracle获取用户下所有表名 获取表所有的列名及数据类型 两个SQL查询语句
Oracle 中获取系统时间可以使用 SYSDATE() 函数,该函数可以返回当前日期和时间。SYSDATE() 函数可以与 TO_CHAR() 函数结合使用,以将日期和时间格式化为字符串。 TO_CHAR() 函数可以将日期、数字或字符串转换为...
- `SYSDATE`:获取系统当前日期和时间。 4. **日期与数字相加**: - Oracle允许日期与数字直接相加减,这是因为日期类型可以隐式转换为天数,数字则被视为天数的倍数。 5. **日期之间的比较**: - 日期可以直接...
在Oracle数据库中,我们可以通过多种方式来获取系统的当前日期或时间。 1. **`SYSDATE`**:使用`SELECT SYSDATE FROM DUAL;`语句可以查询到当前系统的时间。这里的`DUAL`是一个特殊的表,用于返回单行数据,是执行...