准确来说一个礼拜是从星期日开始到星期六结束的,而我们自己的习惯都是按一个礼拜的第一天为星期一,最后一天为星期日来的。
很多的查询条件和统计都需要求得一周的时间段,也就是星期一到星期日的时间段, 我们用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
得到的结果是星期日开始作为第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
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