Spark-SQL常用内置日期时间函数
一、获取当前时间
1、current_date
- 获取当前日期
- 时间格式:
yyyy-MM-dd
spark.sql("select current_date").show(false)
结果显示:
+--------------+
|current_date()|
+--------------+
|2020-11-25 |
+--------------+
2、now()
- 获取当前日期时间
- 时间格式:
yyyy-MM-dd HH:mm:ss.毫秒
spark.sql("select now()").show(false)
结果显示:
+-----------------------+
|current_timestamp() |
+-----------------------+
|2020-11-25 11:02:50.484|
+-----------------------+
3、current_timestamp
- 获取当前日期时间
- 结果完全同
now()
spark.sql("select current_timestamp").show(false)
二、提取时间中的字段
1、year
- 提取时间中的年份
spark.sql("select now()").show(false)
spark.sql("select year(now()) as year").show()
结果显示:
+-----------------------+
|current_timestamp() |
+-----------------------+
|2020-11-25 12:04:28.859|
+-----------------------+
+----+
|year|
+----+
|2020|
+----+
2、month
- 提取时间中的月份
spark.sql("select now()").show(false)
spark.sql("select month(now()) as month").show()
结果显示:
+-----------------------+
|current_timestamp() |
+-----------------------+
|2020-11-25 12:07:44.976|
+-----------------------+
+-----+
|month|
+-----+
| 11|
+-----+
3、day、dayofmonth
- 提取日期中的天
- day 和 dayofmonth 效果完全相同
spark.sql("select now()").show(false)
spark.sql("select day(now()) as day").show()
spark.sql("select dayofmonth(now()) as dayofmonth").show()
结果显示:
+-----------------------+
|current_timestamp() |
+-----------------------+
|2020-11-25 12:09:45.178|
+-----------------------+
+---+
|day|
+---+
| 25|
+---+
+---+
|day|
+---+
| 25|
+---+
4、hour
- 获取时间小时
spark.sql("select now()").show(false)
spark.sql("select hour(now()) as hour").show()
结果显示:
+-----------------------+
|current_timestamp() |
+-----------------------+
|2020-11-25 12:12:58.917|
+-----------------------+
+----+
|hour|
+----+
| 12|
+----+
5、minute
- 获取时间分钟数
spark.sql("select now()").show(false)
spark.sql("select minute(now()) as minute").show()
结果显示:
+-----------------------+
|current_timestamp() |
+-----------------------+
|2020-11-25 12:14:47.916|
+-----------------------+
+------+
|minute|
+------+
| 14|
+------+
6、second
- 获取时间秒数
spark.sql("select second(2020-11-25 12:16:25.172) as second").show()
结果显示:
+------+
|second|
+------+
| 25|
+------+
三、一年中第几天\周\季度
1、dayofyear
- 获取指定日期是当年中的第几天
spark.sql("select dayofyear(now()) as dayNum").show()
结果显示:
+------+
|dayNum|
+------+
| 330|
+------+
2、weekofyear
- 获取指定日期是当年中的第几周
spark.sql("select weekofyear(now()) as weekNum").show()
结果显示:
+-------+
|weekNum|
+-------+
| 48|
+-------+
3、dayofweek、date_format
- 获取指定日期是星期几,可使用获取当前日期函数
- dayofweek 在hive2.2.0开始引入
- 版本较低的时候可以使用以下方式获取日期是星期几
- 注意函数中第二个参数为小写 u
spark.sql("select date_format(now(),'u') as weekMany").show()
结果显示:
+--------+
|weekMany|
+--------+
| 3|
+--------+
4、quarter
- 返回指定日期为第几季度
- 1到3月为一季度,三个月一个季度
spark.sql("select quarter(now())").show()
结果显示:
+------------------------------------------+
|quarter(CAST(current_timestamp() AS DATE))|
+------------------------------------------+
| 4|
+------------------------------------------+
5、trunc
- 选择年或月,选择之后的日期用默认值 01 表示
- 第一个参数为不带时分秒的日期,需写指定日期,不能用时间函数获取当前日期
- 第二个参数可选:
"year"、"yy"、"month"、"mon"、"mm"
,否则返回 null - 这里只处理日期,即结果只显示日期
spark.sql("select trunc('2020-11-25','YEAR') as year").show(false)
结果显示:
+----------+
|year |
+----------+
|2020-01-01|
+----------+
四、日期时间转换
1、unix_timestamp
- 返回当前时间的 unix 时间戳
- 可指定日期,指定日期的同时需要指定日期格式
spark.sql("select unix_timestamp() as unix").show()
spark.sql("select unix_timestamp('2020-11-25','yyyy-MM-dd') as unix").show()
结果显示:
+----------+
| unix|
+----------+
|1606302965|
+----------+
+----------+
| unix|
+----------+
|1606233600|
+----------+
2、to_unix_timestamp
- 将时间转化为时间戳
- 第一个参数为时间,第二个参数为时间格式
- 可传入获取当前日期函数,此时不需要传入日期格式
- 效果与
unix_timestamp
相同
spark.sql("select to_unix_timestamp(now()) as unix").show()
spark.sql("select to_unix_timestamp('2020-11-25','yyyy-MM-dd') as unix").show()
3、from_unixtime
- 将时间戳换算成当前时间
- 可自定义输出日期格式,若不定义则为默认
yyyy-MM-dd HH:mm:ss
spark.sql("select from_unixtime('1606303452') as time").show()
结果显示:
+-------------------+
| time|
+-------------------+
|2020-11-25 19:24:12|
+-------------------+
4、to_date、date
- 将字符串转化为日期格式
- to_date、date效果完全相同
spark.sql("select to_date('2020-11-25') as time").show()
spark.sql("select to_date('2020-11-25','yyyy-MM-dd') as time").show()
结果显示:
+----------+
| time|
+----------+
|2020-11-25|
+----------+
五、日期、时间计算
1、months_between
- 返回两个日期之间的月数
spark.sql("select months_between(now(),'2020-10-29') as monNum").show()
结果显示:
+----------+
| monNum|
+----------+
|0.89760581|
+----------+
2、add_months
- 返回日期后n个月后的日期
spark.sql("select add_months('2020-11-11',1) as afterMonthTime").show()
结果显示:
+--------------+
|afterMonthTime|
+--------------+
| 2020-12-11|
+--------------+
3、date_add(加)、date_sub(减)
- 返回相加(减)n 天后的日期
spark.sql("select date_add(now(),3) as addDay").show()
spark.sql("select date_sub(now(),3) as addDay").show()
结果显示:
+----------+
| addDay|
+----------+
|2020-11-28|
+----------+
+----------+
| addDay|
+----------+
|2020-11-22|
+----------+
4、datediff
- 两个日期间的天数,即两个日期相减
spark.sql("select datediff(now(),'2020-11-20') as diff").show()
结果显示:
+----+
|diff|
+----+
| 5|
+----+
5、last_day(date)
- 返回指定时间当前月份的最后一天
spark.sql("select last_day('2020-10-20') as last_day").show()
结果显示:
+----------+
| last_day|
+----------+
|2020-10-31|
+----------+
6、next_day(start_date, day_of_week)
- 查找指定日期后第一个星期几(第二个参数)
- 即第二个参数为星期几的英文缩写
spark.sql("select next_day('2020-11-20','we') as next_day").show()
结果显示:
+----------+
| next_day|
+----------+
|2020-11-25|
+----------+