准确来说一个礼拜是从星期日开始到星期六结束的,而我们自己的习惯都是按一个礼拜的第一天为星期一,最后一天为星期日来的。
很多的查询条件和统计都需要求得一周的时间段,也就是星期一到星期日的时间段, 我们用to_char和next_day两个函数分别可以求得第一天和最后一天的日期。
1、TO_CHAR 结合 DECODE、TO_NUMBER 函数求得
/** 使用TO_CHAR(SYSDATE,'D')可以求得当前日期是一周的第几天
得到的结果是星期日开始作为第1天的,
那么星期一就是第2天,星期日就是第8天
*/
SELECT
TO_CHAR(
SYSDATE ,
'YYYY-MM-DD' ) 今天,
DECODE(
TO_CHAR(
SYSDATE,
'D'),
'1',
'星期日',
'2',
'星期一',
'3',
'星期二',
'4',
'星期三',
'5',
'星期四',
'6',
'星期五',
'7',
'星期六') 星期几,
TO_CHAR(
SYSDATE -
TO_NUMBER(
TO_CHAR(
SYSDATE,
'D') ) + 2,
'YYYY-MM-DD' ) 星期一,
TO_CHAR(
SYSDATE -
TO_NUMBER(
TO_CHAR(
SYSDATE,
'D') ) + 8,
'YYYY-MM-DD' ) 星期日
FROM
DUAL
2、NEXT_DAY 结合 SUBSTR 函数求得
/** SUBSTR代替DECODE函数
NEXT_DAY 函数可以指定当前日期的下一个星期几的日期
比如:今天是11-25日,星期六,那么 NEXT_DAY(sysdate,'星期一')
得到的日期就是11-27,那么这个星期一的日期就是 11-27 减去 7天
而星期日的日期就是11-27减去1天
*/
SELECT
TO_CHAR(
SYSDATE ,
'YYYY-MM-DD' ) 今天,
'星期'||
SUBSTR(
'日一二三四五六',
TO_NUMBER(
TO_CHAR(
SYSDATE,
'D')),1) 星期几,
TO_CHAR(
NEXT_DAY(
sysdate,
'星期一') - 7,
'YYYY-MM-DD') 星期一,
TO_CHAR(
NEXT_DAY(
sysdate,
'星期一') - 1 ,
'YYYY-MM-DD') 星期日
FROM
DUAL