首先介绍一下trunc()函数的用法:
trunc()函数是对时间类型或者数字进行截取操作的。
用法:
trunc(Date,“fmt”),其中fmt 是我们要展示的时间字段,
trunc(number),该函数表示取整。
SQL:
select trunc(sysdate,'yyyy') from dual;/*返回当前年的第一天*/
select trunc(sysdate, 'mm') from dual;/*返回当前月的第一天*/
select trunc(sysdate, 'dd') from dual;/*返回当前时间的年月日*/
select trunc(sysdate,'iw') from dual;/*以周一为一周开始*/
select trunc(sysdate,'d') from dual;/*以周日为一周开始*/
select trunc(sysdate, 'hh') from dual;/*返回当前小时*/
现在我们能获取到某一周或月的第一天,只要再获取到最后一天即可,周的话每周固定七天,所以只需要获取月的最后一天即可;
SQL:
select to_char(last_day(sysdate),'dd') from dual;/*根据传入日期获取其所在月份最后一天*/
将sysdate替换为我们传入的日期即可(注:last_day()只接受date类型,所以传入的是String类型的话,需要使用to_date()转换一下)
然后使用CONNECT BY和ROWNUM结合:其中CONNECT BY的用法鄙人理解为java中的for循环ROWNUM为i
因此,可以利用CONNECT BY 根据开始日期输出每一个后边的日期知道ROWNUM<每周/月最后一天
SQL:
/*一周内每一天的日期*/
SELECT TO_CHAR((trunc(to_date('2018-12-13','yyyy-mm-dd'), 'iw')) + ROWNUM - 1, 'yyyy-MM-dd') as time_date FROM DUAL
CONNECT BY ROWNUM <= 7
/*一月内每一天的日期*/
SELECT TO_CHAR((trunc(to_date('2018-12-13','yyyy-mm-dd'), 'mm')) + ROWNUM - 1, 'yyyy-MM-dd') as time_date FROM DUAL
CONNECT BY ROWNUM <= to_char(last_day(to_date('2018-12-13','yyyy-mm-dd')),'dd')
这两条SQL返回的即是对应日期所在周和月的每一天,
最后将我们要查的表与之关联查询即可获得某一个月或某周内每一天的数据(注:关联字段为日期(time_date))