###获取某个月份的天数
getMonthMaxDay(){ virdate=`echo ${1}`; virM=`echo ${1}`; viryear=`echo ${virdate}|awk -F "-" '{print $1}'` ; virmonth=`echo ${virdate}|awk -F "-" '{print $2}'` ; virday=`echo ${virdate}|awk -F "-" '{print $3}'` ; #参数为空 if [ ! -n "$virmonth" ]; then virmonth=`echo ${virM}`; fi if [ ! -n "$virmonth" ]; then return 0 fi if [ $virmonth -gt 0 -a $virmonth -lt 13 ] then case $virmonth in 1|01|3|03|5|05|7|07|8|08|10|12 ) maxday=31 ;; 4|04|6|06|9|09|11 ) maxday=30 ;; 2|02 ) if [ `expr $viryear % 4` -eq 0 ] then if [ `expr $viryear % 400` -eq 0 ] then maxday=29 elif [ `expr $viryear % 100` -eq 0 ] then maxday=28 else maxday=29 fi else maxday=28 fi ;; esac fi echo $maxday}####获取后一天日期
getNextDate() { virdate=`echo ${1}`; #划分年月日 viryear=`echo ${virdate}|awk -F "-" '{print $1}'` ; virmonth=`echo ${virdate}|awk -F "-" '{print $2}'` ; virday=`echo ${virdate}|awk -F "-" '{print $3}'` ; #获取某月最后一天 virmonth_endday=`echo $(getMonthMaxDay $virdate )` ; virday=` expr $virday + 1 `; ##当日+1后日期大于月末则月份+1,同时当日设置为1号;月份+1大于12后则年份+1,同时月份设置为1月 if [ ${virday} -gt ${virmonth_endday} ] then virday=` expr 0 + 1 `; virmonth=` expr $virmonth + 1 `; if [ $virmonth -gt 12 ] then virmonth=` expr 0 + 1 `; viryear=` expr ${viryear} + 1 `; fi else virmonth=` expr $virmonth + 0 `; fi ##月份或者日期小于10将月份或者日期的字符前面加一个0,补足两位格式 if [ $virmonth -lt 10 ] then virmonth=`echo 0${virmonth}`; fi if [ $virday -lt 10 ] then virday=`echo 0${virday}`; fi virdate=`echo ${viryear}-${virmonth}-${virday}` ; echo $virdate}##获取后面N天的日期getNextNDate() { virdate=`echo ${1}`; LastN=`echo ${2}`; #划分年月日 num=`echo 1`; while [ ${num} -le ${LastN} ] do virdate=`echo $(getNextDate $virdate )` ; num=` expr $num + 1 `; done echo ${virdate}}####获取前一天日期
getLastDate() { virdate=`echo ${1}`; #划分年月日 viryear=`echo ${virdate}|awk -F "-" '{print $1}'` ; virmonth=`echo ${virdate}|awk -F "-" '{print $2}'` ; virday=`echo ${virdate}|awk -F "-" '{print $3}'` ; #获取某月最后一天 virmonth_endday=`echo $(getMonthMaxDay $virdate )` ; virday=` expr $virday - 1 `; ##当日-1后日期小于等于0,同时当日设置上月月末,同时月份-1 if [ ${virday} -le 0 ] then virmonth=` expr $virmonth - 1 `; if [ $virmonth -le 0 ] then viryear=` expr ${viryear} - 1 `; virmonth=`echo 12`; fi ##月份或者日期小于10将月份或者日期的字符前面加一个0,补足两位格式 if [ $virmonth -lt 10 ] then virmonth=`echo 0${virmonth}`; fi virday=`echo $(getMonthMaxDay ${viryear}-${virmonth}-01 )` ; fi if [ $virday -lt 10 ] then virday=`echo 0${virday}`; fi virdate=`echo ${viryear}-${virmonth}-${virday}` ; echo $virdate}#获取当前数据日期前N天的日期getLastNDate() { virdate=`echo ${1}`; LastN=`echo ${2}`; #划分年月日 num=`echo 1`; while [ ${num} -le ${LastN} ] do virdate=`echo $(getLastDate $virdate )` ; num=` expr $num + 1 `; done echo ${virdate}}###获取当日对应的月的月末日期getEndMonDay() { virdate=`echo ${1}`; viryear=`echo ${virdate}|awk -F "-" '{print $1}'` ; virmonth=`echo ${virdate}|awk -F "-" '{print $2}'` ; virday=`echo ${virdate}|awk -F "-" '{print $3}'` ; maxday=`echo $(getMonthMaxDay $virdate )` ; virdate=`echo ${viryear}-${virmonth}-${maxday}` ; echo $virdate}###获取下月的月末日期getNextMonEndDay() { virdate=`echo ${1}`; virdate=`echo $(getNextMonthDay $virdate )` ; virdate=`echo $(getEndMonDay $virdate )` ; echo $virdate}####获取下月同期日期
getNextMonthDay() { virdate=`echo ${1}`; viryear=`echo ${virdate}|awk -F "-" '{print $1}'` ; virmonth=`echo ${virdate}|awk -F "-" '{print $2}'` ; virday=`echo ${virdate}|awk -F "-" '{print $3}'` ; vir_cur_Endday=`echo $(getMonthMaxDay ${virdate} )` ; vir_cur_day=` expr $virday + 0 `; ##月份+1 virmonth=` expr $virmonth + 1 `; #----如果月份相加大于等于13则将月份置成1月 if [ $virmonth -gt 12 ] then virmonth=1; viryear=` expr ${viryear} + 1 `; fi ##月份小于10 需要前置补足一个0用两位表示月份 if [ $virmonth -lt 10 ] then virmonth=`echo 0${virmonth}`; else virmonth=`echo ${virmonth}`; fi vir_NextM_Endday=`echo $(getMonthMaxDay ${viryear}-${virmonth}-01 )` ; virday=` expr $virday + 0 `; ###如果月份+1的后,月末日期小于传入的参数的日期则将同期设置成月末日期 if [ ${virday} -ge ${vir_NextM_Endday} ] then virday=`echo ${vir_NextM_Endday}`; fi ###如果传入数据日期为当月月末日期,则下月同期就为月末日期 if [ ${vir_cur_day} -eq ${vir_cur_Endday} ] then virday=`echo ${vir_NextM_Endday}`; fi if [ $virday -lt 10 ] then virday=`echo 0${virday}`; fi virdate=`echo ${viryear}-${virmonth}-${virday}` ; echo $virdate}####获取上月同期日期
getLastMonthDay() { virdate=`echo ${1}`; viryear=`echo ${virdate}|awk -F "-" '{print $1}'` ; virmonth=`echo ${virdate}|awk -F "-" '{print $2}'` ; virday=`echo ${virdate}|awk -F "-" '{print $3}'` ; vir_cur_Endday=`echo $(getMonthMaxDay ${virdate} )` ; vir_cur_day=` expr $virday + 0 `; ##月份+1 virmonth=` expr $virmonth - 1 `; #----如果月份相加小于等于0则将月份置成12月 if [ $virmonth -le 0 ] then virmonth=12; viryear=` expr ${viryear} - 1 `; fi ##月份小于10 需要前置补足一个0用两位表示月份 if [ $virmonth -lt 10 ] then virmonth=`echo 0${virmonth}`; else virmonth=`echo ${virmonth}`; fi vir_LastM_Endday=`echo $(getMonthMaxDay ${viryear}-${virmonth}-01 )` ; virday=` expr $virday + 0 `; ###如果月份-1的后,月末日期小于传入的参数的日期则将同期设置成月末日期 if [ ${virday} -ge ${vir_LastM_Endday} ] then virday=`echo ${vir_LastM_Endday}`; fi ###如果传入数据日期为当月月末日期,则下月同期就为月末日期 if [ ${vir_cur_day} -eq ${vir_cur_Endday} ] then virday=`echo ${vir_LastM_Endday}`; fi if [ $virday -lt 10 ] then virday=`echo 0${virday}`; fi virdate=`echo ${viryear}-${virmonth}-${virday}` ; echo $virdate}####获取上月同期数据日期--与前台展现算法一致(若本月日期是月末则上月同期始终为月末日期,不是月末则本月的日期位比上月月末日期大于等于则取上月倒数第二天)
getLMDataDay() { virdate=`echo ${1}`; virdate_End=`echo $(getEndMonDay $virdate )` ; LMdate=`echo $(getLastMonthDay $virdate )` ; LMdate_End=`echo $(getEndMonDay $LMdate )` ; virdate_D=`echo $virdate|cut -c 9-10` virdate_End_D=`echo $virdate_End|cut -c 9-10` LMdate_D=`echo $LMdate|cut -c 9-10` LMdate_End_D=`echo $LMdate_End|cut -c 9-10` if [ ! ${virdate_D} -eq ${virdate_End_D} ] then if [ ${virdate_D} -ge ${LMdate_End_D} ] then LMdate=`echo $(getLastDate $LMdate )` ; fi fi echo $LMdate}####获取去年同期日期(当月为月底则去年同期永远为月底日期)
getLastYearDay() { virdate=`echo ${1}`; viryear=`echo ${virdate}|awk -F "-" '{print $1}'` ; virmonth=`echo ${virdate}|awk -F "-" '{print $2}'` ; virday=`echo ${virdate}|awk -F "-" '{print $3}'` ; vir_cur_Endday=`echo $(getMonthMaxDay ${virdate} )` ; vir_cur_day=` expr $virday + 0 `; viryear=` expr ${viryear} - 1 `; vir_LastY_Endday=`echo $(getMonthMaxDay ${viryear}-${virmonth}-01 )` ; virday=` expr $virday + 0 `; ###如果月份-1的后,月末日期小于传入的参数的日期则将同期设置成月末日期 if [ ${vir_cur_day} -eq ${vir_cur_Endday} ] then virday=`echo ${vir_LastY_Endday}`; fi if [ $virday -lt 10 ] then virday=`echo 0${virday}`; fi virdate=`echo ${viryear}-${virmonth}-${virday}` ; echo $virdate}