工作中,总是要制作各种各样的统计表,周报、月报、年报。还要统计上上周跟上周对比数据,即使已经写好了SQL查询语句并保存,但还是免不了要手动输入日期时间范围,为此还得查询下日历,上周一是几月几号,上个月是否有31日。所以制作了个函数,方便在每个查询统计表的sql语句里调用,无须频繁输入时间。
一、函数介绍
函数名:A_statstime
参数:
lwb(last week begin,即上周一的0点0分0秒)
lwe(last week end,即上周日的23点59分59秒)
lwb(last last week begin,即上上周 周一的0点0分0秒)
lwe(last last week end,即上上周 周日的23点59分59秒)
lyb(last year begin,即去年1月1日的0点0分0秒)
lye(last year end,即去年12月31日的23点59分59秒)
lmb(last month begin,即上个月1日的0点0分0秒)
lme(last month end,即上个月最后一天的23点59分59秒)
nyb(now yeaar begin,即本年度1月1日的0点0分0秒)
nmb(now month begin,即本月1日的0点0分0秒)
ne(now end,即实时,现在时间)
t(自定义,你输入什么时间,它就返回什么时间)
很好记~~
二、函数调用
@b_time=A_statstime(参数)
@e_time=A_statstime(参数)
先在SQL语句开头将函数赋予给b_time和e_time(放在开头也是以便一打开保存的SQL语句,就可以立马看到之前设置的统计日期范围,并可以直接修改参数,何况很多sql语句很长,需要往下翻查找,很不方便)并输入参数。然后将sql语句中'between.....and.....'等时间的查询参数替换一下 ,变成
between @b_time and @e_time
这样每次需要统计时,就直接打开之前保存的sql语句,直接执行就好了,无须再输入时间,倘若是突然要求统计奇葩时间段的数据,比如说要“上个月17日下午3点至23日早上10点的数据,像这种不规则的时间段,我们也只需在开头的函数里直接输入yyyy-MM-dd HH:mm:ss格式的时间就好,因为有个自定义参数t,输入什么,它就返回什么,无须滑动鼠标往下翻去查找
CREATE DEFINER=`root`@`%` FUNCTION `sszwfw`.`A_statstime`(t char(20)) RETURNS varchar(51) CHARSET utf8BEGINIF t='lwb' THEN #上周开始时间RETURN date_format(date_sub(curdate(),interval date_format(curdate(),'%w')-1+7 day),'%Y-%m-%d 00:00:00');ELSEIF t='lwe' THEN #上周结束时间RETURN date_format(date_sub(curdate(),interval date_format(curdate(),'%w')-7+7 day),'%Y-%m-%d 23:59:59');ELSEIF t='llwb' THEN #上上周开始时间RETURN date_format(date_sub(curdate(),interval date_format(curdate(),'%w')-1+14 day),'%Y-%m-%d 00:00:00');ELSEIF t='llwe' THEN #上上周结束时间RETURN date_format(date_sub(curdate(),interval date_format(curdate(),'%w')-7+14 day),'%Y-%m-%d 23:59:59');ELSEIF t='lyb' THEN #去年开始时间RETURN concat(date_format(curdate(),'%Y')-1,'-01-01 00:00:00');ELSEIF t='lye' THEN #去年结束时间RETURN concat(date_format(curdate(),'%Y')-1,'-12-31 23:59:59');ELSEIF t='lmb' THEN #上个月开始时间RETURN concat(date_add(curdate()-day(curdate())+1,interval -1 month),' 00:00:00');ELSEIF t='lme' THEN #上个月结束时间RETURN concat(last_day(date_sub(curdate(),interval 1 month)),' 23:59:59');ELSEIF t='nyb' THEN #今年开始时间RETURN concat(year(curdate()),'-01-01 00:00:00');ELSEIF t='nmb' THEN #本月开始时间return DATE_FORMAT( CURDATE(), '%Y-%m-01 00:00:00');ELSEIF t='ne' THEN #实时RETURN now();ELSEIF t=t THEN #自定义RETURN t;END IF;END




