时间日期函数
# StreamSQL 时间日期函数
时间日期函数用于处理时间和日期数据。除 now/current_time/current_date 外,大多数函数接收字符串形式的日期,支持 2006-01-02 15:04:05 与 2006-01-02 两种格式。
# 当前时间
# NOW - 当前日期时间
语法: now()
描述: 返回当前的日期和时间。
# CURRENT_TIME - 当前时间
语法: current_time()
描述: 返回当前时间。
# CURRENT_DATE - 当前日期
语法: current_date()
描述: 返回当前日期。
# 格式化与解析
# DATE_FORMAT - 日期格式化
语法: date_format(date, format)
描述: 将日期时间按格式串转换为字符串。date 为 time.Time 或可解析的字符串。
格式采用字母模式(与 Java SimpleDateFormat / Spark / Flink 同一约定)。年/日/时/秒大小写均可,唯独 M=月、m=分大小写敏感:
| 符号 | 含义 | 示例输出 |
|---|---|---|
YYYY / yyyy | 年(4 位) | 2006 |
YY / yy | 年(2 位) | 06 |
MM | 月(大写 M) | 01 |
mm / MI / mi | 分(小写 m) | 04 |
DD / dd | 日 | 02 |
HH / hh | 时(24 小时制) | 15 |
SS / ss | 秒 | 05 |
示例:
date_format('2020-03-05 10:20:30', 'yyyy-MM-dd HH:mm:ss') -- '2020-03-05 10:20:30'
date_format('2020-03-05 10:20:30', 'YYYY-MM-DD') -- '2020-03-05'
date_format('2020-03-05 10:20:30', 'HH:mm:ss') -- '10:20:30'
2
3
注意:
mm表示分钟,MM表示月份。误用大写MM会把分钟渲染成月份值。
# DATE_PARSE - 日期解析
语法: date_parse(dateStr, format)
描述: 按格式串解析日期字符串,返回标准格式 2006-01-02 15:04:05。格式串规则与 date_format 一致。
示例: date_parse('2020-03-05', 'yyyy-MM-dd') → '2020-03-05 00:00:00'
# 日期运算
# DATE_ADD - 日期加法
语法: date_add(date, interval, unit)
描述: 给日期加上指定间隔,返回 2006-01-02 15:04:05 格式字符串。unit 支持:year/month/day/hour/minute/second(单复数均可)。
示例: date_add('2020-01-01 00:00:00', 25, 'hour') → '2020-01-02 01:00:00'
当
hour/minute/second的 interval 过大导致time.Duration溢出时返回错误(而非静默回绕)。
# DATE_SUB - 日期减法
语法: date_sub(date, interval, unit)
描述: 给日期减去指定间隔,规则同 date_add。
示例: date_sub('2020-01-02 00:00:00', 1, 'day') → '2020-01-01 00:00:00'
# DATE_DIFF - 日期差
语法: date_diff(date1, date2, unit)
描述: 计算 date1 - date2 在指定单位的差值(int64)。unit 同上。
示例: date_diff('2020-01-02', '2020-01-01', 'day') → 1
year/month按近似换算(年=365 天、月=30 天)。
# Unix 时间戳
# UNIX_TIMESTAMP - 转 Unix 时间戳
语法: unix_timestamp(date)
描述: 将日期转为 Unix 时间戳(秒,int64)。
示例: unix_timestamp('2020-01-01 00:00:00') → 1577836800
# TO_SECONDS - 转秒数时间戳
语法: to_seconds(date)
描述: 将日期转为 Unix 时间戳(秒),与 unix_timestamp 等价。支持 time.Time 或字符串入参。
示例: to_seconds('2020-01-01T00:00:00Z') → 1577836800
# FROM_UNIXTIME - 时间戳转日期
语法: from_unixtime(timestamp)
描述: 将 Unix 时间戳(秒)转为 UTC 2006-01-02 15:04:05 格式字符串。
示例: from_unixtime(1577836800) → '2020-01-01 00:00:00'
# 时区
# CONVERT_TZ - 时区转换
语法: convert_tz(time, timezone)
描述: 将时间转换为指定时区。time 为 time.Time 或可解析字符串;timezone 为 IANA 时区名(如 Asia/Shanghai、America/New_York)。
示例: convert_tz('2023-01-01 12:00:00', 'Asia/Shanghai') → 北京时间 2023-01-01 20:00:00
# 日期部分提取
# EXTRACT - 通用提取
语法: extract(unit, date)
描述: 从日期中提取指定部分。unit 支持:year/month/day/hour/minute/second/weekday/yearday。
示例: extract('year', '2020-03-05') → 2020
以下为便捷提取函数,均接收一个日期字符串,返回对应整数:
| 函数 | 返回 | 范围 |
|---|---|---|
year(date) | 年份 | 如 2020 |
month(date) | 月份 | 1–12 |
day(date) | 日 | 1–31 |
hour(date) | 时 | 0–23 |
minute(date) | 分 | 0–59 |
second(date) | 秒 | 0–59 |
dayofweek(date) | 星期几 | 0–6(0=周日,Go 约定) |
dayofyear(date) | 年内第几天 | 1–366 |
weekofyear(date) | ISO 周数 | 1–53 |
示例:
year('2020-03-05 10:20:30') -- 2020
month('2020-03-05') -- 3
dayofweek('2020-03-05') -- 4(周四)
weekofyear('2020-03-05') -- 10
2
3
4