跳到主要内容
版本:6.6.0

SQL日期中的大小写实践案例

该文只适用于spark ,不同直连数据库DateFormatter不通用。详见:Spark日期函数及应用

大写Y与小写y

案例一:自然年与年周年

今天是2020年12月28日,用时间宏取年月:{{{yesterday %YMMdd}}},返回的是20211228

image.png

产生原因

在SQL里,y 是Year(自然年), Y 表示的是Week year(年周年);

Week year 意思是当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,那么这周就算入下一年。

【举例】:2020-12-28 本周刚好跨年,且Week year是从上周日开始算的,那么昨天(2020年12月27日,周日)就刚好是跨年周的第一天,是属于2021年的第一周的,所以就出现了上面的情况。

解决方法

年份要用小写的y来写:

image.png

总结

  1. 在遇到时间格式化的最好就用小写的y
例如:
date_format(yyyy-MM-dd)
to_date(yyyy-MM-dd)
{{{yesterday %y}}}

案例二:date_format函数

date_format([日期],"YYYY-MM"),为什么2019年12月31号会被识别为“2020-12”?

产生原因

date_format的正确用法为date_format([日期],"yyyy-MM"),而不是大写的"YYYY",“YYYY”表示的是以周为周期的年,作为19年最后一天,实际被算作了20年的第一周。

解决方法

写成date_format([日期],"yyyy-MM"),就可以了:

image.png

注意

YYYY的问题,有两个地方会遇,一个是新建字段的表达式,一个是时间宏,要注意一下。

比如:{{{today%yyyy-MM}}}不要写成{{{today%YYYY-MM}}}。

大写MM与小写mm

使用to_date()函数转化日期时,发现对数对不上。函数写法:to_date([日期]),"yyyymmdd")

产生原因:

这里的小写的mm代表的是分钟,正确写法是大写的MM,应该写成:to_date([日期]),"yyyyMMdd")

image.png