Hive日期转换

日期转换的问题

先提两句y和Y的区别,

  • y:year-of-era:正正经经的年;
  • Y:week-based-year:只要本周跨年,那么这周就算下一年,比如说如果2020-12-28是星期一,而这周四是2021年,那如果用Y的话,2020-12-28这一天实际上就会被解析成2021-12-28;那这个Y有啥应用场景吗不懂

今天遇到一个匪夷所思的问题,是在解决string类型的“20201027”转换成“2020-10-27”的过程中出现的,即:

select to_date(from_unixtime(UNIX_TIMESTAMP('20201027','yyyyMMdd'))) -- 2020-10-27

select to_date(from_unixtime(UNIX_TIMESTAMP('20201027','yyyymmdd'))) -- 2020-01-27

结果是不一样的,思考良久,最终在大谷同学的帮助下解决了这个问题,大谷同学当时说,“这个mm会不会被解释成了分钟呢”,深以为然,遂做如下验证:

select from_unixtime(UNIX_TIMESTAMP('20201027', 'yyyymmdd')) -- 2020-01-27 00:10:00
select from_unixtime(UNIX_TIMESTAMP('20201027', 'yyyyMMdd')) -- 2020-10-27 00:00:00

所以大谷同学的看法是正确的,的确是将mm解释成了分钟,而月份在MM缺省的情况下,自动置为了一月份。

在这个过程中,让我们意外的是,代码并没有报错,就是说,hive对年月日时分秒的位置组合是没有强限制的(或者这是通病?),于是我们尝试:

select from_unixtime(UNIX_TIMESTAMP('20201027', 'MMyyyydd')) -- 2011-08-27 00:00:00

也就是说它只负责按位置读取,比想象的要人工智障一些,他将“20201027”解释成了2010年/20月/27, 转换成12月份制,正好是上面的答案。于是,作为补充说明,我们做了以下尝试:

select from_unixtime(UNIX_TIMESTAMP('20201326', 'yyyyMMdd')) -- 2021-01-26 00:00:00

可以看到多出来的月份自动推到后面了,就很wonderful。

总之,以后再转换的话,要严格记住形式,一定是大写的M代表月份,小写的m代表分钟;

你可能感兴趣的:(#,SQL基础,sql)