oracle周数计算
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle周数计算相关的知识,希望对你有一定的参考价值。
参考技术Aoracle周数计算
===========================================================
作者: keyneslin()
发表于: :
分类: ORACLE
出处:
================================================
日期计算 算第n周的第一天及最后一天是几号 by keynes
================================================
ww的算法为每年 月 日为第一周开始 date+ 为每一周结尾
例如 为第一周的第一天 而第一周的最后一天为 + =
公式 每周第一天 date + 周 *
每周最后一天 date + 周 *
不管怎么编排格式都会跑掉 真气人 ~><~
=========================================================================
日期计算 算第n周的第一天及最后一天是几号 by keynes
=========================================================================
ww的算法为每年 月 日为第一周开始 date+ 为每一周结尾
例如 为第一周的第一天 而第一周的最后一天为 + =
公式 每周第一天 date + 周 *
每周最后一天 date + 周 *
如果以ww格式为主 第 周的起迄如下
:asdb:WF>select to_date( yyyymmdd ) + * to_date( yyyymmdd ) + * from dual;
TO_DATE( TO_DATE(
JAN JAN
:asdb:WF>select to_date( yyyymmdd ) + * to_date( yyyymmdd ) + * from dual;
TO_DATE( TO_DATE(
APR APR
Elapsed: : :
验证如下
:asdb:WF>select to_char(to_date( yyyymmdd ) ww ) as weekn to_char(to_date( yyyymmdd ) ww ) as week to_char(to_date( yyyymmdd ) ww ) as week to_char(to_date( yyyymmdd ) ww ) as weekn from dual;
WEEK WEEK WEEK WEEK
Elapsed: : :
:asdb:WF>
iw的算法为星期一至星期日算一周 且每年的第一个星期一为第一周
例如 为星期六 所以用iw的算法是前年的 周 而 之后才是第一周的开始
公式 每周第一天 next_day(date) + 周 *
每周最后一天 next_day(date) + 周 *
如果以iw格式为主 第 周的起迄如下
:asdb:WF>select next_day(to_date( yyyymmdd ) MONDAY )+ * as first_day next_day(to_date( yyyymmdd ) MONDAY )+ * as last_day from dual;
FIRST_DAY LAST_DAY
JAN JAN
Elapsed: : :
:asdb:WF>
:asdb:WF>select next_day(to_date( yyyymmdd ) MONDAY )+ * as first_day next_day(to_date( yyyymmdd ) MONDAY )+ * as last_day from dual;
FIRST_DAY LAST_DAY
APR MAY
Elapsed: : :
:asdb:WF>
验证如下
:asdb:WF>select to_char(to_date( yyyymmdd ) iw ) as weekn to_char(to_date( yyyymmdd ) iw ) as week to_char(to_date( yyyymmdd ) iw ) as week to_char(to_date( yyyymmdd ) iw ) as weekn from dual;
WEEK WEEK WEEK WEEK
Elapsed: : :
其它
== 查今天是 本月 的第几周
SELECT TO_CHAR(SYSDATE WW ) TO_CHAR(TRUNC(SYSDATE MM ) WW ) + AS weekOfMon from dual;
或
SELECT TO_CHAR(SYSDATE W ) AS weekOfMon from dual;
== 查今天是 今年 的第几周
select to_char(sysdate ww ) from dual;
或
select to_char(sysdate iw ) from dual;
附注
上文所提之iw及ww格式在doc内解释如下
IW = Week of year ( or ) based on the ISO standard
WW = Week of year ( ) where week starts on the first day of the year and continues to the seventh day of the year
参考文件
Format Models
oracle周数计算(续)
===========================================================
作者: keyneslin()
发表于: :
分类: ORACLE
出处:
本篇是接续前一篇 因有朋友(allenc)要计算oracle的周数日期起迄
所以测试了一下
测试结果如下
特殊周数计算
星期日到星期六为一周(与ww及iw算法不同)
例 年的第一周起迄是同一天 是
例 年的第一周起为 迄为
计算第一周的天数
create or replace function fdf(p_date in date) return number
is
begin
检查是否传入要计算那一年的一月一日
if to_char(to_char(p_date ddd )) <> then
return null;
end if;
如果第一周的第一天刚好也是最后一天时 传回
if to_char(p_date d ) <> then
return (next_day(p_date SATURDAY ) p_date + );
else
return ;
end if;
exception
when others then
dbms_output put_line(sqlerrm);
end;
计算公式
起 decode(周 计算当年的一月一日 计算当年的一月一日 + (fdf(计算当年的一月一日) + (周 )* )) as 起
迄(第一种算法) decode(周 to_date(to_char(计算当年的一月一日 yyyy )|| || yyyymmdd ) 计算当年的一月一日 + (fdf(计算当年的一月一日) + (周 )* )) as 迄
迄(第二种算法) decode(周 last_day(trunc(计算当年的一月一日 mm )+ ) 计算当年的一月一日 + (fdf(计算当年的一月一日) + (周 )* )) as 迄
上面的参数部份 计算当年的一月一日 为date type 周 为number type
传回值一律是date型态
例如
年第 周
select decode( to_date( yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as s_week decode( to_date(to_char(to_date( yyyymmdd ) yyyy )|| || yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as e_week from dual;
年第 周
select decode( to_date( yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as s_week decode( to_date(to_char(to_date( yyyymmdd ) yyyy )|| || yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as e_week from dual;
年第 周
select decode( to_date( yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as s_week decode( to_date(to_char(to_date( yyyymmdd ) yyyy )|| || yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as e_week from dual;
年第 周
select decode( to_date( yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as s_week decode( to_date(to_char(to_date( yyyymmdd ) yyyy )|| || yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as e_week from dual;
年第 周
select decode( to_date( yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as s_week decode( to_date(to_char(to_date( yyyymmdd ) yyyy )|| || yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as e_week from dual;
年第 周
select decode( to_date( yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as s_week decode( to_date(to_char(to_date( yyyymmdd ) yyyy )|| || yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as e_week from dual;
年第 周方法
select decode( to_date( yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as s_week decode( last_day(trunc(to_date( yyyymmdd ) mm )+ ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as e_week from dual;
结果如下
:asdb:WF> 年第 周
:asdb:WF>select decode( to_date( yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as s_week decode( to_date(to_char(to_date( yyyymmdd ) yyyy )|| || yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as e_week from dual;
S_WEEK E_WEEK
JAN JAN
Elapsed: : :
:asdb:WF> 年第 周
:asdb:WF>select decode( to_date( yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as s_week decode( to_date(to_char(to_date( yyyymmdd ) yyyy )|| || yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as e_week from dual;
S_WEEK E_WEEK
JAN JAN
Elapsed: : :
:asdb:WF> 年第 周
:asdb:WF>select decode( to_date( yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as s_week decode( to_date(to_char(to_date( yyyymmdd ) yyyy )|| || yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as e_week from dual;
S_WEEK E_WEEK
DEC DEC
Elapsed: : :
:asdb:WF>
:asdb:WF> 年第 周
:asdb:WF>select decode( to_date( yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as s_week decode( to_date(to_char(to_date( yyyymmdd ) yyyy )|| || yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as e_week from dual;
S_WEEK E_WEEK
JAN JAN
Elapsed: : :
:asdb:WF> 年第 周
:asdb:WF>select decode( to_date( yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as s_week decode( to_date(to_char(to_date( yyyymmdd ) yyyy )|| || yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as e_week from dual;
S_WEEK E_WEEK
JAN JAN
Elapsed: : :
:asdb:WF> 年第 周
:asdb:WF>select decode( to_date( yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as s_week decode( to_date(to_char(to_date( yyyymmdd ) yyyy )|| || yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as e_week from dual;
S_WEEK E_WEEK
DEC DEC
Elapsed: : :
lishixinzhi/Article/program/Oracle/201311/18269
在红移中计算一年中的周数作为excel中的weeknum()
【中文标题】在红移中计算一年中的周数作为excel中的weeknum()【英文标题】:calculate in redshift the week number of the year as weeknum() in excel 【发布时间】:2020-02-07 13:50:01 【问题描述】:我需要在 redhsift sql 中计算一年中的周数,从星期日到星期六,从一月一日开始,但在第一个星期六发生后截断第一周。 有点像 WEEKNUM() 在 excel 中工作:
例如,2020 年将是 (mm/dd/yyyy)
01/01/2020 -> 周数 = 1 ... 01/04/2020 -> 周数 = 1 01/05/2020 -> 周数 = 2 ... 01/11/2020 -> 周数 = 2 01/12/2020 -> 周数 = 3同时:
12/31/2019 -> weeknum = "2019 年的最后一周"我怎样才能做到这一点?
【问题讨论】:
【参考方案1】:这给出了 AFAICT 遵循 Excel 和 MSSQL 行为的周数:
星期是星期日-星期六 一年的第一天总是第一周 一年的第一天/最后一天不一定是整周case when to_char(date_trunc('year', some_date), 'iw') = '01'
then to_char(some_date + '1 day'::interval, 'iw')
else to_char(some_date + '8 days'::interval, 'iw')
end
【讨论】:
以上是关于oracle周数计算的主要内容,如果未能解决你的问题,请参考以下文章
如何在Oracle中生成一周的第一天,一周的最后一天和两个日期之间的周数
c#中计算当前时间是今年第几周 与ORACLE数据库中ww转化相同
c#中计算当前时间是今年第几周 与ORACLE数据库中ww转化相同