按周統(tǒng)計(jì)信息及秒值轉(zhuǎn)換為時(shí)分秒工具類

有時(shí)需要按周統(tǒng)計(jì)信息,或者將沒有數(shù)據(jù)的日期補(bǔ)齊返給前端形成統(tǒng)計(jì)圖:條形圖、餅圖等

一、java方式

獲取當(dāng)前日期上一個(gè)自然周內(nèi)數(shù)據(jù),注意默認(rèn)的是星期六到星期一,如果想讓星期一是第一天~星期日,就要獲取本周的星期日,上周的星期一,再通過sql傳入計(jì)算的開始時(shí)間截止時(shí)間:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class DateUtil {

    public static final String DATE_PATTERN = "yyyy-MM-dd";
    public static final String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";

    /**
     * 獲取星期的第一天,最后一天
     * n為推遲的周數(shù),1本周,-1向前推遲一周,2下周,依次類推
     * m為星期幾
     */
    public static String getWeek(int n, int m) {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, n * 7);
        cal.set(Calendar.DAY_OF_WEEK, m);
        return new SimpleDateFormat(DateUtil.DATE_PATTERN).format(cal.getTime());
    }

    /**
     * 獲取兩個(gè)日期(含時(shí)分秒)相差的天數(shù),包含今天
     *
     * @param startDate
     * @param endDate
     * @return
     * @throws ParseException
     */
    public static int dateBetweenIncludeToday(Date startDate, Date endDate) throws ParseException {
        return dateBetween(startDate, endDate) + 1;
    }

    public static int dateBetween(Date startDate, Date endDate) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        startDate = sdf.parse(sdf.format(startDate));
        endDate = sdf.parse(sdf.format(endDate));
        Calendar cal = Calendar.getInstance();
        cal.setTime(startDate);
        long time1 = cal.getTimeInMillis();
        cal.setTime(endDate);
        long time2 = cal.getTimeInMillis();
        long between_days = (time2 - time1) / (1000 * 3600 * 24);
        return Integer.parseInt(String.valueOf(between_days));
    }

    /**
     * 將秒值轉(zhuǎn)換為時(shí)分秒工具類
     *
     * @param second
     * @return
     */
    public static String secToTime(int second) {
        int hour = second / 3600;
        int minite = second % 3600 / 60;
        int sec = second % 60;
        String timeStr = "";
        if (hour > 0) {
            timeStr += hour + "小時(shí)";
        }
        if (minite > 0) {
            timeStr += minite + "分";
        }
        if (sec > 0) {
            timeStr += sec + "秒";
        }
        return timeStr;
    }
     public static void main(String[] args) {
        String startTime = DateUtil.getWeek(-1, Calendar.MONDAY);
        String endTime= DateUtil.getWeek(0, Calendar.SUNDAY);
    }
}


二、數(shù)據(jù)庫(kù)方式

統(tǒng)計(jì)上一周的每天用戶注冊(cè)數(shù)量,沒有數(shù)量的補(bǔ)齊日期,mysql為例:

  SELECT
            t1.timeDay as date,ifnull(t2.num,0) num
        FROM (
            SELECT
                date_format(lastWeek.`timeDay`,'%m-%d') as 'timeDay'
            FROM (
                select DATE_SUB(NOW(),interval 13 day) as 'timeDay'
                UNION ALL
                select DATE_SUB(NOW(),interval 12 day) as 'timeDay'
                UNION ALL
                select DATE_SUB(NOW(),interval 11 day) as 'timeDay'
                UNION ALL
                select DATE_SUB(NOW(),interval 10 day) as 'timeDay'
                UNION ALL
                select DATE_SUB(NOW(),interval 9 day) as 'timeDay'
                UNION ALL
                select DATE_SUB(NOW(),interval 8 day) as 'timeDay'
                UNION ALL
                select DATE_SUB(NOW(),interval 7 day) as 'timeDay'
                UNION ALL
                select DATE_SUB(NOW(),interval 6 day) as 'timeDay'
                UNION ALL
                select DATE_SUB(NOW(),interval 5 day) as 'timeDay'
                UNION ALL
                select DATE_SUB(NOW(),interval 4 day) as 'timeDay'
                UNION ALL
                select DATE_SUB(NOW(),interval 3 day) as 'timeDay'
                UNION ALL
                select DATE_SUB(NOW(),interval 2 day) as 'timeDay'
                UNION ALL
                select DATE_SUB(NOW(),interval 1 day) as 'timeDay'
            ) as lastWeek
            WHERE YEARWEEK(lastWeek.`timeDay`,1) = YEARWEEK(NOW(),1)-1
        ) as t1
        LEFT JOIN (
            SELECT
                count( DISTINCT user_id ) num,
                DATE_FORMAT( a.create_time, "%m-%d" )  date
            FROM
               user_info a
             
            GROUP BY
                DATE_FORMAT (a.create_time,"%Y-%m-%d")
        ) as t2 ON t1.timeDay = t2.date
        ORDER BY t1.timeDay
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容