postgresql 实现得到时间对应周的周一案例
两种方法:
第一种:
DO$$ declaredint; declared1varchar(100); declared2varchar(100); declared3date; declared4date; begin d3:=CURRENT_DATE; d1:='selectdate'''||d3||''''; d:=(SELECTEXTRACT(DOWFROMd3))-1; d2:=d1||'-INTERVAL'''||d||'day'''; EXECUTEd2intod4; RAISENOTICE'ok%',d4; end$$
结果:
[SQL]DO$$ declaredint; declared1varchar(100); declared2varchar(100); declared3date; declared4date; begin d3:=CURRENT_DATE; d1:='selectdate'''||d3||''''; d:=(SELECTEXTRACT(DOWFROMd3))-1; d2:=d1||'-INTERVAL'''||d||'day'''; EXECUTEd2intod4; RAISENOTICE'ok%',d4; end$$ NOTICE:ok2016-06-13 时间:0.004s 受影响的行:0
解析:
declare:声明变量
CURRENT_DATE:得到当前日期
SELECTCURRENT_DATE;
结果:
date 2016-06-12
extract:从时间中抽出相应的字段
DOW一周里的第几天(sunday=0saturday=6)
格式:
EXTRACT(fieldFROMsource)
当前日期是一周里面的第几天
SELECTEXTRACT(DOWFROMCURRENT_DATE);
结果:
date_part 0
INTERVAL:时间间隔类型
EXECUTE:执行一个准备好的查询
RAISENOTICE:把结果显示出来
第二种:
SELECTCURRENT_DATE+cast(-1*(TO_NUMBER(to_char(CURRENT_DATE,'D'),'99')-2)||'days'asinterval);
结果:
?column? 2016-06-1300:00:00
解析:
TO_NUMBER将一个字符串转换成数字
格式:
TO_NUMBER(string,format)
--一周里的日子(1-7;周日是1) selectto_char(CURRENT_DATE,'D') DDD一年里的日子(001-366) DD一个月里的日子(01-31) D一周里的日子(1-7;周日是1) selectto_char(to_date('2016-06-12','yyyy-mm-dd'),'D') selectto_number(‘1.1','9.99')fromdual; 1.1 selectto_number(‘1.121','9.99')fromdual; 1.12 --将得到的字符串转换成数字 selectTO_NUMBER(to_char(CURRENT_DATE,'D'),'99') --因为得到的星期一为2,所以要减去2 selectTO_NUMBER(to_char(CURRENT_DATE,'D'),'99')-2 --将得到的数字乘以-1比如例子中:-1*3就是-3,也就是减去3天 selectcast(-1*3||'days'asinterval) --就是将当天减去0天得到了星期一的日期 selectcast(-1*0||'days'asinterval)+CURRENT_DATE SELECTto_char(CURRENT_DATE+cast(-1*(TO_NUMBER(to_char(CURRENT_DATE,'D'),'99')-2)||'days'asinterval),'yyyy-mm-dd');
补充:Postgresql数据数据库中按日、月、周、年、时、分,30分钟的统计解决方案
对要统计的时间字段进行字符转换处理,再按照其分组即可实现对数据进行日,周,月,年,时,分,秒的统计
1、按日统计
to_char(h.row_date,'yyyy-MM-dd')ASrow_date2 GROUPBYto_char(h.row_date,'yyyy-MM-dd')
2、按月统计
to_char(h.row_date,'yyyy-MM')ASrow_date2 GROUPBYto_char(h.row_date,'yyyy-MM')
3、按年统计
to_char(h.row_date,'yyyy')ASrow_date2 GROUPBYto_char(h.row_date,'yyyy')
4、按小时统计
to_char(h.row_date,'yyyy-MM-ddHH')ASrow_date2 GROUPBYto_char(h.row_date,'yyyy-MM-ddHH')
5、按分钟统计
to_char(h.row_date,'yyyy-MM-ddHH:mm')ASrow_date2 GROUPBYto_char(h.row_date,'yyyy-MM-ddHH:mm')
6、按周统计
按周统计最简单法
对时间row_date字段做处理,变成对应日期周一时间,然后按这个周一的时间去统计。减1的操作表示为对应日期的星期一,减1,2,3,4,5,6,7分别是对应日期的周一,周二,周三,周四,周五、周六、周日。
to_char(h.row_date-(extract(dowfromh.row_date)-1||'day')::interval,'yyyy-MM-dd')row_date
然后按上面的语句分组统计即可实现按周统计,下面对应分组函数
GROUPBYto_char(h.row_date-(extract(dowfromh.row_date)-1||'day')::interval,'yyyy-MM-dd')
按周统计之方法二(较复杂,不建议使用)
to_char(h.row_date,'yyyy')||EXTRACT(weekFROMh.row_date)::INTEGERASrow_date2
获取到数据库输出的字段中的年份和周数。
Stringrow_date=rs.getString("row_date2"); //获取数据库输出日期的年份 intyear=Integer.parseInt(row_date.substring(0,4)); //获取数据库输出日期的周数 if(row_date.length()>=6){ week=Integer.parseInt(row_date.substring(4,6));} else{ week=Integer.parseInt(row_date.substring(4,5)); } Stringrow_date2=getFirstDayOfWeek(year,week); trafficMap.put("row_date",row_date2);
将查询出的内容日期转换成当周周一的时间
//将周统计中获取的如201636,表示2016年36周,获取其周一的时间 publicStringgetFirstDayOfWeek(intyear,intweek){ //先滚动到该年 nows.set(Calendar.YEAR,year); //滚动到周 nows.set(Calendar.WEEK_OF_YEAR,week); //得到该周第一天 nows.set(Calendar.DAY_OF_WEEK,2); StringfirstDay=df.format(nows.getTime()); returnfirstDay; }
7、按30分钟进行统计
casewhensubstr(to_char(h.row_date,'yyyy-mm-ddhh24:mi'),15,16)::integer<=30thento_char(h.row_date,'yyyy-mm-ddhh24')||':30'elseto_char(h.row_date,'yyyy-mm-ddhh24')||':60'endasrow_date2 GROUPBYcasewhensubstr(to_char(h.row_date,'yyyy-mm-ddhh24:mi'),15,16)::integer<=30thento_char(h.row_date,'yyyy-mm-ddhh24')||':30'elseto_char(h.row_date,'yyyy-mm-ddhh24')||':60'end
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。