Oracle中如何生成一周的第一天、一周的最后一天和两个日期之间的周数
How to generate the first day of the week, the last day of the week and week number between two dates in Oracle
我想插入 table :
- 从星期一开始一周的第一天。
- 一周的最后一天作为星期日。
- 周数 =>(1-52 或 1-53)基于 ISO 标准。
首先,我尝试 select 特定日期的第一天、最后一天和周数,它起作用了:
WITH ranges AS
(
SELECT to_date('29-10-2012', 'dd-MM-yyyy') AS DATE_TEST FROM DUAL
)
SELECT DATE_TEST "DATE",
TO_CHAR( NEXT_DAY( TRUNC(DATE_TEST) , 'SUNDAY' )) "WEEK END DATE",
TO_CHAR(TO_DATE(DATE_TEST,'DD-MON-YYYY'),'WW')+1 "WEEK NUMBER"
FROM ranges ;
但现在我想显示两个日期之间的数据,但我只得到 start_date 的结果。有人可以帮忙。
之后,当一切正常时,我将全部插入 table。
谢谢
WITH ranges AS(
select to_date('29-OCT-2012', 'dd-MM-yyyy') START_DATE,
to_date('31-DEC-2016', 'dd-MM-yyyy') END_DATE
from dual
)
SELECT START_DATE "DATE",
TO_CHAR( NEXT_DAY( TRUNC(START_DATE) , 'SUNDAY' )) "WEEK END DATE",
TO_CHAR(TO_DATE(START_DATE,'DD-MON-YYYY'),'WW')+1 "WEEK NUMBER"
FROM ranges ;
您似乎在寻找 日历。
根据您的 RANGES
CTE,还有另一个 - calendar
利用分层查询创建 start_date
和 end_date
之间的所有日期。获得所有日期后,提取您感兴趣的值。
SQL> with
2 ranges as
3 (select to_date('29-OCT-2012', 'dd-MM-yyyy') start_date,
4 to_date('31-DEC-2016', 'dd-MM-yyyy') end_date
5 from dual
6 ),
7 calendar as
8 (select start_date + level - 1 as datum
9 from ranges
10 connect by level <= end_date - start_date + 1
11 )
12 select
13 min(datum) start_date,
14 min(next_day(datum, 'sunday')) week_end_date,
15 to_char(datum, 'ww') week_number
16 from calendar
17 group by to_char(datum, 'yyyy'), to_char(datum, 'ww')
18 order by 1;
START_DATE WEEK_END_D WE
---------- ---------- --
29-10-2012 04-11-2012 44
04-11-2012 11-11-2012 45
11-11-2012 18-11-2012 46
18-11-2012 25-11-2012 47
25-11-2012 02-12-2012 48
<snip>
09-12-2016 11-12-2016 50
16-12-2016 18-12-2016 51
23-12-2016 25-12-2016 52
30-12-2016 01-01-2017 53
222 rows selected.
SQL>
这是一种使通用 table 表达式 return 日期范围的方法。
with ranges (dt) as (
select to_date('29-OCT-2012', 'dd-MM-yyyy') as dt
from dual
union all
select ranges.dt+1
from ranges
where ranges.dt < to_date('31-DEC-2016', 'dd-MM-yyyy')
)
然后你可以用它来计算其他值。
SELECT dt "DATE"
, TO_CHAR(NEXT_DAY(TRUNC(dt), 'SUNDAY')) "WEEK END DATE"
, TO_CHAR(TO_DATE(dt,'DD-MON-YYYY'),'WW') + 1 "WEEK NUMBER"
, cast(TO_CHAR(dt, 'WW') as int) +
case when cast(TO_CHAR(dt, 'D') as int) < cast(TO_CHAR(trunc(dt, 'year'), 'D') as int) then 1 else 0 end WeekNumberInYear
FROM ranges ;
如果您想一次完成所有日期计算,请查看此处的示例:https://dbfiddle.uk/?rdbms=oracle_18&fiddle=35e407af3b5bf711bb7ae53b8cf0e608
你好吗?
为了提供帮助,我试着做了一些研究,我找到了这些链接。
我发现:
SELECT
ROUND((TRUNC(SYSDATE) - TRUNC(SYSDATE, 'YEAR')) / 7,0) CANTWEEK,
NEXT_DAY(SYSDATE, 'SUNDAY') - 7 第一天,
NEXT_DAY(SYSDATE, 'SUNDAY') - 1 最后一天
来自双
和
select
to_char(系统日期 - to_char(系统日期, 'd') + 2, 'yyyymmdd') first_day_of_week
, to_char(系统日期 - to_char(系统日期, 'd') + 8, 'yyyymmdd') last_day_of_week
从
双
和
select sysdate AS 今天,
TRUNC(next_day(sysdate,'MONDAY')-8) 作为多明戈,
TRUNC(next_day(sysdate,'SATURDAY')) 作为 SABADO
来自双
我这里没有 oracle,所以我无法很好地测试它,但它应该可以解决您的需求,任何事情都可以告诉我:)
格式 WW
returns 一年中的第几周 (1-53) 其中第 1 周从一年的第一天开始,一直持续到一年的第七天,参见 Datetime Format Elements
为了根据 ISO-8601 标准使用格式获取周数 IW
。我会这样建议:
WITH ranges AS(
SELECT
DATE '2012-10-29' START_DATE,
DATE '2016-12-31' END_DATE
FROM dual
)
SELECT
START_DATE, END_DATE,
TRUNC(START_DATE + 7*(LEVEL-1), 'IW') AS Week_Start_Date,
TRUNC(START_DATE + 7*(LEVEL-1), 'IW') + 6 AS Week_End_Date,
TO_CHAR(TRUNC(START_DATE + 7*(LEVEL-1)), 'IYYY-"W"IW') WEEK_NUMBER
FROM ranges
CONNECT BY START_DATE + 7*(LEVEL-1) <= END_DATE;
我想插入 table :
- 从星期一开始一周的第一天。
- 一周的最后一天作为星期日。
- 周数 =>(1-52 或 1-53)基于 ISO 标准。
首先,我尝试 select 特定日期的第一天、最后一天和周数,它起作用了:
WITH ranges AS
(
SELECT to_date('29-10-2012', 'dd-MM-yyyy') AS DATE_TEST FROM DUAL
)
SELECT DATE_TEST "DATE",
TO_CHAR( NEXT_DAY( TRUNC(DATE_TEST) , 'SUNDAY' )) "WEEK END DATE",
TO_CHAR(TO_DATE(DATE_TEST,'DD-MON-YYYY'),'WW')+1 "WEEK NUMBER"
FROM ranges ;
但现在我想显示两个日期之间的数据,但我只得到 start_date 的结果。有人可以帮忙。
之后,当一切正常时,我将全部插入 table。
谢谢
WITH ranges AS(
select to_date('29-OCT-2012', 'dd-MM-yyyy') START_DATE,
to_date('31-DEC-2016', 'dd-MM-yyyy') END_DATE
from dual
)
SELECT START_DATE "DATE",
TO_CHAR( NEXT_DAY( TRUNC(START_DATE) , 'SUNDAY' )) "WEEK END DATE",
TO_CHAR(TO_DATE(START_DATE,'DD-MON-YYYY'),'WW')+1 "WEEK NUMBER"
FROM ranges ;
您似乎在寻找 日历。
根据您的 RANGES
CTE,还有另一个 - calendar
利用分层查询创建 start_date
和 end_date
之间的所有日期。获得所有日期后,提取您感兴趣的值。
SQL> with
2 ranges as
3 (select to_date('29-OCT-2012', 'dd-MM-yyyy') start_date,
4 to_date('31-DEC-2016', 'dd-MM-yyyy') end_date
5 from dual
6 ),
7 calendar as
8 (select start_date + level - 1 as datum
9 from ranges
10 connect by level <= end_date - start_date + 1
11 )
12 select
13 min(datum) start_date,
14 min(next_day(datum, 'sunday')) week_end_date,
15 to_char(datum, 'ww') week_number
16 from calendar
17 group by to_char(datum, 'yyyy'), to_char(datum, 'ww')
18 order by 1;
START_DATE WEEK_END_D WE
---------- ---------- --
29-10-2012 04-11-2012 44
04-11-2012 11-11-2012 45
11-11-2012 18-11-2012 46
18-11-2012 25-11-2012 47
25-11-2012 02-12-2012 48
<snip>
09-12-2016 11-12-2016 50
16-12-2016 18-12-2016 51
23-12-2016 25-12-2016 52
30-12-2016 01-01-2017 53
222 rows selected.
SQL>
这是一种使通用 table 表达式 return 日期范围的方法。
with ranges (dt) as (
select to_date('29-OCT-2012', 'dd-MM-yyyy') as dt
from dual
union all
select ranges.dt+1
from ranges
where ranges.dt < to_date('31-DEC-2016', 'dd-MM-yyyy')
)
然后你可以用它来计算其他值。
SELECT dt "DATE"
, TO_CHAR(NEXT_DAY(TRUNC(dt), 'SUNDAY')) "WEEK END DATE"
, TO_CHAR(TO_DATE(dt,'DD-MON-YYYY'),'WW') + 1 "WEEK NUMBER"
, cast(TO_CHAR(dt, 'WW') as int) +
case when cast(TO_CHAR(dt, 'D') as int) < cast(TO_CHAR(trunc(dt, 'year'), 'D') as int) then 1 else 0 end WeekNumberInYear
FROM ranges ;
如果您想一次完成所有日期计算,请查看此处的示例:https://dbfiddle.uk/?rdbms=oracle_18&fiddle=35e407af3b5bf711bb7ae53b8cf0e608
你好吗?
为了提供帮助,我试着做了一些研究,我找到了这些链接。
我发现:
SELECT ROUND((TRUNC(SYSDATE) - TRUNC(SYSDATE, 'YEAR')) / 7,0) CANTWEEK, NEXT_DAY(SYSDATE, 'SUNDAY') - 7 第一天, NEXT_DAY(SYSDATE, 'SUNDAY') - 1 最后一天 来自双
和
select to_char(系统日期 - to_char(系统日期, 'd') + 2, 'yyyymmdd') first_day_of_week , to_char(系统日期 - to_char(系统日期, 'd') + 8, 'yyyymmdd') last_day_of_week 从 双
和
select sysdate AS 今天, TRUNC(next_day(sysdate,'MONDAY')-8) 作为多明戈, TRUNC(next_day(sysdate,'SATURDAY')) 作为 SABADO 来自双
我这里没有 oracle,所以我无法很好地测试它,但它应该可以解决您的需求,任何事情都可以告诉我:)
格式 WW
returns 一年中的第几周 (1-53) 其中第 1 周从一年的第一天开始,一直持续到一年的第七天,参见 Datetime Format Elements
为了根据 ISO-8601 标准使用格式获取周数 IW
。我会这样建议:
WITH ranges AS(
SELECT
DATE '2012-10-29' START_DATE,
DATE '2016-12-31' END_DATE
FROM dual
)
SELECT
START_DATE, END_DATE,
TRUNC(START_DATE + 7*(LEVEL-1), 'IW') AS Week_Start_Date,
TRUNC(START_DATE + 7*(LEVEL-1), 'IW') + 6 AS Week_End_Date,
TO_CHAR(TRUNC(START_DATE + 7*(LEVEL-1)), 'IYYY-"W"IW') WEEK_NUMBER
FROM ranges
CONNECT BY START_DATE + 7*(LEVEL-1) <= END_DATE;