大数据学习(127)-hive日期函数

🍋🍋大数据学习🍋🍋

🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。
💖如果觉得博主的文章还不错的话,请点赞👍+收藏⭐️+留言📝支持一下博主哦🤞


一、日期提取类函数

1. dayofweek(date)
  • 功能:返回日期的星期几(1 = 星期日,2 = 星期一,...,7 = 星期六)。

  • 示例

    复制代码
    SELECT dayofweek('2023-10-01');  -- 返回 1(星期日)
2. year(date) / month(date) / day(date)
  • 功能:提取日期的年、月、日部分。

  • 示例

    复制代码
    SELECT year('2023-10-01');  -- 返回 2023
    SELECT month('2023-10-01');  -- 返回 10
    SELECT day('2023-10-01');    -- 返回 1
3. hour(time) / minute(time) / second(time)
  • 功能:提取时间的时、分、秒部分。

  • 示例

    复制代码
    SELECT hour('2023-10-01 14:30:45');  -- 返回 14
    SELECT minute('2023-10-01 14:30:45');  -- 返回 30
    SELECT second('2023-10-01 14:30:45');  -- 返回 45
4. weekofyear(date)
  • 功能:返回日期在当年的周数(1-53)。

  • 示例

    复制代码
    SELECT weekofyear('2023-10-01');  -- 返回 40(第40周)
5. dayofmonth(date) / dayofyear(date)
  • 功能:返回日期在当月或当年的天数。

  • 示例

    复制代码
    SELECT dayofmonth('2023-10-01');  -- 返回 1
    SELECT dayofyear('2023-10-01');   -- 返回 274(10月1日是第274天)

二、日期计算类函数

1. datediff(enddate, startdate)
  • 功能 :计算两个日期之间的天数差(enddate - startdate)。

  • 示例

    复制代码
    SELECT datediff('2023-10-10', '2023-10-01');  -- 返回 9
2. date_add(startdate, days) / date_sub(startdate, days)
  • 功能:在日期上加减指定天数。

  • 示例

    复制代码
    SELECT date_add('2023-10-01', 7);  -- 返回 '2023-10-08'
    SELECT date_sub('2023-10-01', 3);  -- 返回 '2023-09-28'
3. add_months(startdate, months)
  • 功能:在日期上加减指定月数。

  • 示例

    复制代码
    SELECT add_months('2023-10-01', 3);  -- 返回 '2024-01-01'
    SELECT add_months('2023-10-31', 1);  -- 返回 '2023-11-30'(自动处理月底)
4. months_between(enddate, startdate)
  • 功能:计算两个日期之间的月数差(结果为浮点数)。

  • 示例

    复制代码
    SELECT months_between('2023-12-01', '2023-10-01');  -- 返回 2.0
    SELECT months_between('2023-10-15', '2023-10-01');  -- 返回 ~0.5

三、日期格式化类函数

1. date_format(date, format)
  • 功能 :将日期格式化为指定字符串(支持 yyyy-MM-dd 等格式)。

  • 示例

    复制代码
    SELECT date_format('2023-10-01', 'yyyy-MM-dd');  -- 返回 '2023-10-01'
    SELECT date_format('2023-10-01', 'yyyy/MM/dd');  -- 返回 '2023/10/01'
    SELECT date_format('2023-10-01', 'MM-dd-yyyy');  -- 返回 '10-01-2023'
2. from_unixtime(unix_timestamp [, format])
  • 功能 :将 Unix 时间戳转换为日期字符串(默认格式 yyyy-MM-dd HH:mm:ss)。

  • 示例

    复制代码
    SELECT from_unixtime(1696185600);  -- 返回 '2023-10-01 00:00:00'
    SELECT from_unixtime(1696185600, 'yyyy-MM-dd');  -- 返回 '2023-10-01'
3. unix_timestamp([date [, format]])
  • 功能:将日期字符串转换为 Unix 时间戳(秒)。

  • 示例

    复制代码
    SELECT unix_timestamp('2023-10-01 00:00:00');  -- 返回 1696185600
    SELECT unix_timestamp('2023/10/01', 'yyyy/MM/dd');  -- 返回 1696185600

四、特殊日期函数

1. current_date
  • 功能 :返回当前日期(格式 yyyy-MM-dd)。

  • 示例

    复制代码
    SELECT current_date;  -- 返回执行时的日期,如 '2023-10-01'
2. current_timestamp
  • 功能:返回当前时间戳(带时分秒)。

  • 示例

    复制代码
    SELECT current_timestamp;  -- 返回 '2023-10-01 14:30:45.123'
3. trunc(date, format)
  • 功能:将日期截断到指定单位(年、月等)。

  • 示例

    复制代码
    SELECT trunc('2023-10-15', 'YEAR');  -- 返回 '2023-01-01'(年初)
    SELECT trunc('2023-10-15', 'MONTH');  -- 返回 '2023-10-01'(月初)
4. last_day(date)
  • 功能:返回日期所在月份的最后一天。

  • 示例

    复制代码
    SELECT last_day('2023-10-01');  -- 返回 '2023-10-31'
    SELECT last_day('2023-02-01');  -- 返回 '2023-02-28'(平年2月)
5. next_day(date, weekday)
  • 功能 :返回日期之后的第一个指定星期几(weekday 为英文缩写,如 'MO''TU')。

  • 示例

    复制代码
    SELECT next_day('2023-10-01', 'MO');  -- 返回 '2023-10-02'(下一个周一)
    SELECT next_day('2023-10-01', 'SU');  -- 返回 '2023-10-08'(下一个周日)

五、时区转换函数

1. from_utc_timestamp(timestamp, timezone)
  • 功能:将 UTC 时间转换为指定时区的时间。

  • 示例

    复制代码
    SELECT from_utc_timestamp('2023-10-01 00:00:00', 'Asia/Shanghai');  -- 返回 '2023-10-01 08:00:00'
2. to_utc_timestamp(timestamp, timezone)
  • 功能:将指定时区的时间转换为 UTC 时间。

  • 示例

    复制代码
    SELECT to_utc_timestamp('2023-10-01 08:00:00', 'Asia/Shanghai');  -- 返回 '2023-10-01 00:00:00'

注意事项

  1. 日期格式要求

    • 大多数函数要求日期为 yyyy-MM-ddyyyy-MM-dd HH:mm:ss 格式。
    • 若格式不符,需先用 unix_timestamp()date_format() 转换。
  2. 版本差异

    • Hive 2.x 及以上版本支持更多函数(如 date_format),低版本可能需使用 from_unixtime 替代。
  3. 性能建议

    • 避免在 WHERE 子句中对日期字段使用函数(如 WHERE year(date_col) = 2023),会导致全表扫描。
    • 推荐用范围查询:WHERE date_col >= '2023-01-01' AND date_col < '2024-01-01'

示例场景

场景 1:计算用户注册后 7 天内的活跃率
复制代码
WITH user_registration AS (
    SELECT 
        user_id,
        reg_date
    FROM users
),
user_activity AS (
    SELECT 
        user_id,
        activity_date
    FROM user_logs
)
SELECT 
    ur.user_id,
    ua.activity_date,
    DATEDIFF(ua.activity_date, ur.reg_date) AS days_since_reg,
    CASE WHEN DATEDIFF(ua.activity_date, ur.reg_date) <= 7 THEN 1 ELSE 0 END AS is_active_within_7d
FROM user_registration ur
LEFT JOIN user_activity ua ON ur.user_id = ua.user_id;
场景 2:统计每月最后一天的订单量
复制代码
SELECT 
    order_date,
    COUNT(order_id) AS order_count
FROM orders
WHERE order_date = last_day(order_date)
GROUP BY order_date;
相关推荐
微露清风7 小时前
系统性学习Linux-第二讲-基础开发工具
linux·运维·学习
阳光九叶草LXGZXJ8 小时前
达梦数据库-学习-48-DmDrs控制台命令(同步之Manager、CPT模块)
linux·运维·数据库·sql·学习
biuyyyxxx8 小时前
Python自动化办公学习笔记(一) 工具安装&教程
笔记·python·学习·自动化
极客数模9 小时前
【2026美赛赛题初步翻译F题】2026_ICM_Problem_F
大数据·c语言·python·数学建模·matlab
丝斯201110 小时前
AI学习笔记整理(66)——多模态大模型MOE-LLAVA
人工智能·笔记·学习
军军君0111 小时前
Three.js基础功能学习十三:太阳系实例上
前端·javascript·vue.js·学习·3d·前端框架·three
编程彩机11 小时前
互联网大厂Java面试:从分布式架构到大数据场景解析
java·大数据·微服务·spark·kafka·分布式事务·分布式架构
bylander11 小时前
【AI学习】TM Forum《Autonomous Networks Implementation Guide》快速理解
人工智能·学习·智能体·自动驾驶网络
xxxmine11 小时前
redis学习
数据库·redis·学习
vx-bot55566611 小时前
企业微信接口在多租户SaaS平台中的集成架构与数据隔离实践
大数据·架构·企业微信