年周(年+周)的算法

21 篇文章 0 订阅
10 篇文章 2 订阅

  在很多场景下需要由日期获得该日期对应的年周(例如:2016-11-22对应的年周为201647),在iso标准中,当在跨年计算年周时候, Calendar中calendar.get(Calendar.WEEK_OF_YEAR)的算法:跨年周(即1月1日所处的那周)的归属原则为跨年周的周四处于哪年,则该跨年周属于哪年。例如,2016-01-01的那周的周四(2015-12-31)在2015年,那么2016-01-01对应的年周为201553;2014-01-01的那周的周四(2014-01-02)在2014年,那么2013-12-31对应的年周为201401;
  下面列举集中编程语言的算法(按一年有1~53周,区别于西方的0~52周):
(1) Hive中算法

select case when weekofyear(p_log_date) < 10 and month(p_log_date) > 11 then (year(p_log_date)+1)*100 + weekofyear(p_log_date)
            when weekofyear(p_log_date) > 10 and month(p_log_date) < 2 then (year(p_log_date)-1)*100 + weekofyear(p_log_date)
            else year(p_log_date)*100 + weekofyear(p_log_date) end as year_week

或

select case when weekofyear(p_log_date) < 10 and month(p_log_date) > 11 then concat(year(p_log_date)+1,lpad(weekofyear(p_log_date),2,'0'))
            when weekofyear(p_log_date) > 10 and month(p_log_date) < 2 then concat(year(p_log_date)-1,lpad(weekofyear(p_log_date),2,'0'))
            else concat(year(p_log_date),lpad(weekofyear(p_log_date),2,'0')) end as year_week   

举例

select case when weekofyear('2017-01-02') < 10 and month('2017-01-02') > 11 then (year('2017-01-02')+1)*100+weekofyear('2017-01-02')
            when weekofyear('2017-01-02') > 10 and month('2017-01-02') < 2 then (year('2017-01-02')-1)*100+weekofyear('2017-01-02')
            else year('2017-01-02')*100+weekofyear('2017-01-02') end as year_week  

(2) Java中的算法

    public static Calendar newCalendar(){
        Calendar c = Calendar.getInstance();
        c.setFirstDayOfWeek(Calendar.MONDAY);
        c.setMinimalDaysInFirstWeek(4);//跨年周 周四在哪年 本周属于哪年
        return c;
    }

    public static int getYearWeek(Date date){
        Calendar c = newCalendar();
        c.setTime(date);
        int week = c.get(Calendar.WEEK_OF_YEAR);
        int month = c.get(Calendar.MONTH)+1;
        int year = c.get(Calendar.YEAR);
        if(week<10 && month>11){
            return (year+1)*100+week;
        }else if(week>10 && month<2){
            return (year-1)*100+week;
        }else {
            return year*100 + week;
        }
    }
    public static void main(String[] args) {
        Calendar c = Calendar.getInstance();
        c.set(Calendar.YEAR, 2016);
        c.set(Calendar.MONTH, 0);
        c.set(Calendar.DAY_OF_MONTH, 3);
        int yearWeek = getYearWeek(c.getTime());
        System.out.println(yearWeek);
    }

(3) mysql中的算法
mysql中算法也可以仿照(1)中hive的写法,但mysql的DATE_FORMAT()函数能直接取得年周,DATE_FORMAT()参数说明:
http://www.w3school.com.cn/sql/func_date_format.asp
其中用到两个关键参数
这里写图片描述
由于中国人的习惯,应选择%x%v
代码举例如下:

SELECT DATE_FORMAT(NOW(),'%x%v') year_week FROM DUAL
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值