大写Y与小写y案例一:时间宏的自然年与年周年问题:今天是2020年12月28日,用时间宏取年月:{{{yesterday %YMMdd}}},返回的是20211228 产生原因:在时间宏里,小写 y 是Year(自然年), 大写Y 表示的是Week year(年周年);Week year 意思是当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,那么这周就算入下一年。 【举例】:2020-12-28 本周刚好跨年,且Week year是从上周日开始算的,那么昨天(2020年12月27日,周日)就刚好是跨年周的第一天,是属于2021年的第一周的,所以就出现了上面的情况。 解决方法:不需要展示周的场景里,年份要用小写的 y 。 案例二:Spark SQL 的 date_format函数问题:date_format([日期],"YYYY-MM"),为什么2019-12-31会被识别为“2020-12”? 产生原因:Spark SQL里,小写 y 是Year(自然年), 大写 Y 表示的是ISO Week year(ISO年周年),一周从周一开始,周日结束,如果包含1月1日的一周在新一年中天数超过3天,则为新一年第1周;否则,它是上一年的最后一周。所以2019年最后一天,实际被算作了2020年的第一周。 解决方法:函数正确写法为 date_format([日期],"yyyy-MM")。同理,Spark里其他日期函数,例如 to_date()也要遵循同样用法。 注意 大小写Y的问题,有两个地方会遇,一个是新建字段的函数,一个是时间宏,但是SparkSQL和时间宏里的Week year(年周年)划分标准并不完全相同,返回的周数也会不一致。不同直连数据库用法也可能存在不同,使用时要注意一下。更多Spark日期函数用法请参考 Spark日期和时间函数。 大写MM与小写mm问题:使用to_date()函数转化日期时,发现对数对不上。函数写法:to_date([日期]),"yyyymmdd") 产生原因:SparkSQL 的大写MM代表的是月份(month),小写mm代表的是分钟(minute)。 解决方法:转换日期时,正确写法是大写的MM,应该写成:to_date([日期]),"yyyyMMdd") |