0%

date created: 2025-12-23 09:47
tags:

  • 时间
  • Timestmap
  • Flink
  • 时区
    category: Bigdata
    date updated: 2026-08-17 20:24
    title: 各引擎timestamp格式名称对齐

1 各引擎timestamp格式名称对齐

1.1.1 Timestmap

Flink Iceberg Spark MySQL
timestmap 默认就是毫秒精度 timestamp timestampntz DATETIME(3)
timestampltz timestamptz timestamp

从DLA拉取元数据时,默认精度为MILLIS

1.1.2 时间精度

类型 精度 单位
TIMESTAMP(0) 0 位小数
TIMESTAMP(1) 1 位小数 0.1 秒(100ms)
TIMESTAMP(2) 2 位小数 10ms
TIMESTAMP(3) 3 位小数 毫秒(ms)
TIMESTAMP(6) 6 位小数 微秒(μs)
TIMESTAMP(9) 9 位小数 纳秒(ns)

1.1.3 避免隐式转换

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TEMPORARY VIEW SalesDataSource AS
SELECT
*
FROM
(
VALUES
(1766073600000),
(1766080800000)
) AS T(testt);
insert into mysql_table
select
CAST(FROM_UNIXTIME(testt/1000) AS DATE) as day_time
from SalesDataSource

MySQL中day_time的字段类型是DATEDATETIME,输入的结果总是1970

  • testtBIGINT(毫秒时间戳)
  • FROM_UNIXTIME(testt/1000) 返回的是 TIMESTAMP
  • CAST(... AS DATE) 会变成 Flink 的 DATE 类型
  • 如果 MySQL 字段是 DATETIMETIMESTAMP,写入时 Flink JDBC connector 会把 DATE 转换为 0,显示成 1970-01-01

解决方案: 避免隐式转换

1
2
3
4
-- Flink的Timestamp 对应的类型就是 DateTime(3), 无需强制转换
FROM_UNIXTIME(testt/1000) AS day_time
-- 显示Cast成TIMESTAMP(3)也可以
CAST(FROM_UNIXTIME(testt/1000) AS TIMESTAMP(3)) AS day_time
Flink SQL Connector/Java MySQL 类型
DATE java.sql.Date DATE 只有年月日,精度到天
TIMESTAMP java.sql.Timestamp DATETIME或TIMESTAMP 精度到毫秒

Flink SQL中使用CAST(... AS DATE)写入MySQL DATETIME, JDBC Sink会把毫秒部分丢掉,甚至映射失败,默认值会变成0->1970-01-01