你可以用它来计算值:
计算包含开始日期的一周中的星期一与本周的星期一之间的完整天数:
( TRUNC( SYSDATE, 'IW' ) - TRUNC( start_date, 'IW' ) )
除以 7 得到整周数:
/ 7
乘以你想每周匹配的天数
* 2
然后调整它以删除在开始日期之前计算的星期一和星期四。如果开始日是星期一,则为 0 调整,周二至周四为 1,周五至周日为 2:
- DECODE( TRUNC( start_date ) - TRUNC( start_date, 'IW' ),
0, 0, -- Monday
1, 1, -- Tuesday
2, 1, -- Wednesday
3, 1, -- Thursday
4, 2, -- Friday
5, 2, -- Saturday
6, 2 -- Sunday
)
然后调整它以包括从本周的星期一到今天的天数:
+ DECODE( TRUNC( SYSDATE ) - TRUNC( SYSDATE, 'IW' ),
0, 1, -- Monday
1, 1, -- Tuesday
2, 1, -- Wednesday
3, 2, -- Thursday
4, 2, -- Friday
5, 2, -- Saturday
6, 2 -- Sunday
)
SQL Fiddle
Oracle 11g R2 架构设置:
CREATE TABLE table_name ( start_date ) AS
SELECT DATE '2018-05-20' + LEVEL - 1
FROM DUAL
CONNECT BY DATE '2018-05-20' + LEVEL - 1 <= SYSDATE;
查询 1:
SELECT start_date,
TO_CHAR( start_date, 'DY' ) As day,
( TRUNC( SYSDATE, 'IW' ) - TRUNC( start_date, 'IW' ) ) / 7 * 2
- DECODE( TRUNC( start_date ) - TRUNC( start_date, 'IW' ),
0, 0, 1, 1, 2, 1, 3, 1, 4, 2, 5, 2, 6, 2 )
+ DECODE( TRUNC( SYSDATE ) - TRUNC( SYSDATE, 'IW' ),
0, 1, 1, 1, 2, 1, 3, 2, 4, 2, 5, 2, 6, 2 ) AS num_mon_and_thurs
FROM table_name
Results:
| START_DATE | DAY | NUM_MON_AND_THURS |
|----------------------|-----|-------------------|
| 2018-05-20T00:00:00Z | SUN | 4 |
| 2018-05-21T00:00:00Z | MON | 4 |
| 2018-05-22T00:00:00Z | TUE | 3 |
| 2018-05-23T00:00:00Z | WED | 3 |
| 2018-05-24T00:00:00Z | THU | 3 |
| 2018-05-25T00:00:00Z | FRI | 2 |
| 2018-05-26T00:00:00Z | SAT | 2 |
| 2018-05-27T00:00:00Z | SUN | 2 |
| 2018-05-28T00:00:00Z | MON | 2 |
| 2018-05-29T00:00:00Z | TUE | 1 |
| 2018-05-30T00:00:00Z | WED | 1 |
| 2018-05-31T00:00:00Z | THU | 1 |
如果我想将星期一和星期四改为星期二、星期三、星期六怎么办?我该怎么做?
SELECT start_date,
TO_CHAR( start_date, 'DY' ) As day,
( TRUNC( SYSDATE, 'IW' ) - TRUNC( start_date, 'IW' ) ) / 7 * 3
- DECODE( TRUNC( start_date ) - TRUNC( start_date, 'IW' ),
0, 0, 1, 0, 2, 1, 3, 2, 4, 2, 5, 2, 6, 3 )
+ DECODE( TRUNC( SYSDATE ) - TRUNC( SYSDATE, 'IW' ),
0, 0, 1, 1, 2, 2, 3, 2, 4, 2, 5, 3, 6, 3 ) AS num_tue_wed_sat
FROM table_name;
SQLFIDDLE