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-15

2. 日期 ↔ 字符串转换

-- 日期转字符串
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-15

2. 时间间隔计算

-- 日期差(天数)
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-01

2. 日期有效性

-- 验证日期格式
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');

注意事项:

  1. 日期格式:Hive默认支持yyyy-MM-ddyyyy-MM-dd HH:mm:ss格式

  2. NULL处理:无效日期通常返回NULL

  3. 性能:避免在WHERE条件中对日期字段使用函数,影响分区裁剪

  4. 时区:注意服务器时区和业务时区差异