SparkSQL中时间日期、字符串、时间戳之间转换

以下是基于 Apache Spark SQL 官方文档及搜索结果总结的时间、日期和时间戳相关核心函数,按功能分类整理:


一、获取当前时间

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

    SELECT current_date(); -- 2025-03-26
    
  2. current_timestamp()now()
    返回当前时间戳(格式:yyyy-MM-dd HH:mm:ss.SSS)。

    SELECT current_timestamp(); -- 2025-03-26 14:30:45.123
    

二、提取时间字段

  1. 提取年/月/日等

    • year(date):提取年份
    • month(date):提取月份(1-12)
    • day(date)dayofmonth(date):提取日期(1-31)
    • hour(timestamp):提取小时(0-23)
    • minute(timestamp):提取分钟(0-59)
    • second(timestamp):提取秒(0-59)。
    SELECT year('2025-03-26'); -- 2025
    
  2. 周/季度相关

    • weekofyear(date):返回 ISO 周数(周一为一周起始)。
    • quarter(date):返回季度(1-4)。
    • dayofweek(date):返回星期(1=周日,7=周六)。

三、时间格式转换

  1. from_unixtime(unix_time, format)
    将 Unix 时间戳(秒)转为字符串,默认格式 yyyy-MM-dd HH:mm:ss

    • HH 表示 24 小时制,hh 为 12 小时制。
    SELECT from_unixtime(1743019200, 'yyyy-MM-dd HH:mm:ss'); -- 2025-03-26 12:00:00
    
  2. to_date(string, format)
    将字符串转为日期类型,默认格式 yyyy-MM-dd

    SELECT to_date('2025/03/26', 'yyyy/MM/dd'); -- 2025-03-26
    
  3. to_timestamp(string, format)
    将字符串转为时间戳类型,默认格式 yyyy-MM-dd HH:mm:ss


四、时间计算

  1. 日期加减

    • date_add(start_date, days):日期加 N 天
    • date_sub(start_date, days):日期减 N 天
    • add_months(start_date, num_months):日期加 N 月。
    SELECT date_add('2025-03-26', 7); -- 2025-04-02
    
  2. 时间差计算

    • datediff(end_date, start_date):返回两个日期间的天数差
    • months_between(end_date, start_date):返回两个日期间的月数差(含小数)。
    SELECT datediff('2025-04-01', '2025-03-26'); -- 6
    
  3. 首尾日期

    • last_day(date):返回当月最后一天
    • next_day(date, day_of_week):返回下一个指定星期几的日期(如 'MON')。
    SELECT last_day('2025-03-26'); -- 2025-03-31
    

五、时间截断与格式化

  1. trunc(date, unit)
    按单位(year/month/day)截断日期,其他部分置为默认值。

    SELECT trunc('2025-03-26', 'MONTH'); -- 2025-03-01
    
  2. date_trunc(unit, timestamp)
    按单位截断时间戳,如 HOUR 会保留小时,分钟以下置零。

    SELECT date_trunc('HOUR', '2025-03-26 14:30:45'); -- 2025-03-26 14:00:00
    
  3. date_format(timestamp, format)
    将时间戳格式化为指定字符串(格式符与 Java 兼容,如 yyyy-MM-dd HH:mm:ss)。

    SELECT date_format(now(), 'yyyy年MM月dd日'); -- 2025年03月26日
    

六、时间戳与 Unix 时间转换

  1. unix_timestamp()
    返回当前 Unix 时间戳(秒)。

    SELECT unix_timestamp(); -- 1743019200
    
  2. from_unixtime()to_unix_timestamp()
    双向转换 Unix 时间戳与日期字符串。


七、UTC 时间处理

  1. to_utc_timestamp(timestamp, timezone)
    将指定时区时间转为 UTC 时间。

    SELECT to_utc_timestamp('2025-03-26 14:30:45', 'Asia/Shanghai'); -- 2025-03-26 06:30:45 UTC
    
  2. from_utc_timestamp(timestamp, timezone)
    将 UTC 时间转为指定时区时间。


八、时间窗口函数

  1. window(time_column, window_duration, slide_duration)
    按时间窗口聚合数据,支持微秒级精度(如 10 minutes)。
    SELECT window(event_time, '5 minutes') AS window, COUNT(*) 
    FROM events 
    GROUP BY window;
    

完整函数列表与示例可参考 Spark 官方文档