Hive提供了丰富的日期处理函数,以下是一些常用且重要的日期函数分类整理:
一、获取当前时间
-- 当前日期和时间(Timestamp格式)
SELECT current_timestamp(); -- 2024-01-15 10:30:45.123
-- 当前日期(Date格式)
SELECT current_date(); -- 2024-01-15二、日期格式转换
1. 字符串 ↔ 日期转换
-- 字符串转日期/时间戳
SELECT to_date('2024-01-15'); -- 2024-01-15
SELECT cast('2024-01-15' as date); -- 2024-01-15
SELECT unix_timestamp('2024-01-15 10:30:00'); -- 时间戳(秒)
SELECT from_unixtime(1705293000); -- 2024-01-15 10:30:00 (返回值:字符串)
-- 自定义格式转换
SELECT to_date(from_unixtime(unix_timestamp('15/01/2024', 'dd/MM/yyyy'))); -- 2024-01-152. 日期 ↔ 字符串转换
-- 日期转字符串
SELECT date_format(current_date(), 'yyyy-MM-dd'); -- 2024-01-15
SELECT date_format(current_timestamp(), 'yyyy年MM月dd日 HH:mm:ss'); -- 2024年01月15日 10:30:45三、日期提取
1. 提取日期部分
-- 提取年月日等
SELECT year('2024-01-15'); -- 2024
SELECT month('2024-01-15'); -- 1
SELECT day('2024-01-15'); -- 15
SELECT hour('2024-01-15 10:30:45'); -- 10
SELECT minute('2024-01-15 10:30:45'); -- 30
SELECT second('2024-01-15 10:30:45'); -- 45
-- 星期相关
SELECT dayofweek('2024-01-15'); -- 2(周日=1,周一=2)
SELECT weekday('2024-01-15'); -- 0(周一=0,周日=6)2. 复杂提取
-- 季度
SELECT quarter('2024-01-15'); -- 1
-- 一年中的第几天
SELECT dayofyear('2024-01-15'); -- 15
-- 月份中的第几天
SELECT dayofmonth('2024-01-15'); -- 15
-- 一年中的第几周
SELECT weekofyear('2024-01-15'); -- 3四、日期计算
1. 日期加减
-- 加减天数
SELECT date_add('2024-01-15', 7); -- 2024-01-22
SELECT date_sub('2024-01-15', 7); -- 2024-01-08
-- 加减月份
SELECT add_months('2024-01-15', 3); -- 2024-04-15
SELECT add_months('2024-01-15', -3); -- 2023-10-152. 时间间隔计算
-- 日期差(天数)
SELECT datediff('2024-01-20', '2024-01-15'); -- 5
-- 月份差
SELECT months_between('2024-04-15', '2024-01-15'); -- 3.0
-- 时间差(秒数)
SELECT unix_timestamp('2024-01-15 11:00:00') - unix_timestamp('2024-01-15 10:30:00'); -- 1800五、日期判断与处理
1. 日期判断
-- 月末判断
SELECT last_day('2024-01-15'); -- 2024-01-31
-- 当月第一天
SELECT trunc('2024-01-15', 'MM'); -- 2024-01-01
-- 季度第一天
SELECT trunc('2024-01-15', 'Q'); -- 2024-01-012. 日期有效性
-- 验证日期格式
SELECT to_date('2024-13-15'); -- NULL(无效日期返回NULL)六、实用案例
1. 获取最近30天日期
SELECT date_sub(current_date(), n) as date
FROM (
SELECT posexplode(split(space(29), ' '))
) t WHERE n <= 29;2. 计算年龄
SELECT floor(months_between(current_date(), '1990-01-15')/12) as age;3. 工作日计算(示例)
-- 计算下一个工作日(跳过周末)
SELECT
CASE
WHEN dayofweek(date_add('2024-01-15', 1)) IN (1,7)
THEN date_add('2024-01-15', 2)
ELSE date_add('2024-01-15', 1)
END as next_workday;七、日期窗口函数
-- 按周、月等聚合
SELECT
user_id,
count(*) OVER (
PARTITION BY user_id
ORDER BY unix_timestamp(event_time)
RANGE BETWEEN 86400 PRECEDING AND CURRENT ROW
) as daily_count
FROM events;八、时区处理
-- 时区转换
SELECT from_utc_timestamp(current_timestamp(), 'Asia/Shanghai');
SELECT to_utc_timestamp(current_timestamp(), 'Asia/Shanghai');注意事项:
日期格式:Hive默认支持
yyyy-MM-dd和yyyy-MM-dd HH:mm:ss格式NULL处理:无效日期通常返回NULL
性能:避免在WHERE条件中对日期字段使用函数,影响分区裁剪
时区:注意服务器时区和业务时区差异
评论