Tableau 解析类函数图解——理解数据类型及其转换

做数据分析时,我们常常遇到一类问题:字段里混着"25.1U""26.5PK2"这种文本,要从中拆出日期、转换成数字,才能

做数据分析时,我们常常遇到一类问题:字段里混着"25.1U""26.5PK2"这种文本,要从中拆出日期、转换成数字,才能做真正的分析。

上一篇文章我们讲了如何用正则把子串"提取"出来;这一篇我们把镜头拉高一点——先理解数据类型这件事本身,再看 Tableau 里一整族"解析 / 转换"函数是怎么把"串"变成"强类型字段"的,最后补一个 SQL 视角的对照。

- Tableau 正则表达式实战:从混合字符串里精准拆出「年.月」

📌 核心问题:混合字符串(如"25.1U")无法直接分析,需要通过类型解析将文本转换为可计算的强类型字段

📌 关键方法:DATEPARSE 是 Tableau 解析族的核心——先看清日/月/年/时在字段中的位置(A/B/C/D),再拼出格式串让 Tableau「翻译」成日期

📌 跨工具视角:Tableau 的 DATEPARSE(string→date)与 SQL 的 strftime(date→string)互为逆运算,理解「类型」与「解析」,就能在任意工具间迁移这套认知

一、从数据库存储看数据类型

数据类型,是对数据存储的"预先定义"。 它普遍存在于 Excel、各类关系型数据库,也存在于 Tableau 的数据提取中。理解它,是理解一切"解析"动作的前提。

1.1 为什么要有数据类型

  • 存储效率:定长还是变长,直接决定磁盘占用与读写速度。
  • 运算语义:同样是 "1" 和 "1",字符串相加是 "11",整数相加是 2——结果由类型决定。
  • 自动校验:13 月非法、字母不能进整数列——类型在写入时就替你把了关。

1.2 常见的数据类型家族

图1 数据类型分类货架图
图:数据类型分类货架——文本、整数、浮点、日期、日期时间、布尔六大家族
  • 文本 / 字符串(String、VARCHAR、TEXT):变长存储,如 "25.1U",可做拼接、提取、正则匹配。
  • 整数(INT、BIGINT):定长(4/8 字节),如 25,可做精确的四则运算。
  • 浮点 / 小数(FLOAT、DECIMAL):定长,如 25.1,做聚合与近似计算(注意可能有精度误差)。
  • 日期(DATE):定长(三个整数),如 2025-01-01,可做加减、截断、下钻。
  • 日期时间(DATETIME、TIMESTAMP):在日期基础上多了时分秒。
  • 布尔(BOOLEAN):仅占 1 位,TRUE / FALSE,常用于筛选。

1.3 同一份"数字"在不同类型下的命运

  • 当字符串 "25.1":只能拼接、提取,无法直接求和。
  • 当浮点 25.1:可参与加减、聚合。
  • 当日期(解析之后):可做时间差、连续 / 离散切换、下钻分析。

类型选错,存储与运算全错——这就是数据必须先"定义类型"的根本原因。

1.4 类型系统的"丰富度",藏着产品的定位

图2 类型丰富度与产品定位图
图:从 Excel 到数据库,不同产品的类型丰富度反映了各自的定位与取舍

一个工具支持多少种类型、区分得多细,往往反映了它的定位与取舍:

  • 过度简化的 BI:不区分整数与小数,把所有数字都当浮点存。表面清爽,但在大数据量聚合时,浮点比整数更慢、更耗内存,还可能引入精度误差——这种简化省了用户一时的心智,却赔上了引擎的计算效率。
  • Tableau(BI 工具):只保留分析真正用得上的五种——小数、整数、字符串、日期、日期时间。既保留了整数 / 小数之分(关乎聚合精度与性能),又不让分析师陷入数据库那种类型泥潭,是"够用且克制"的平衡点。
  • 关系型数据库:有几十种(INT / BIGINT / TINYINT / DECIMAL(p,s) / FLOAT / VARCHAR(n) / CHAR / TEXT / DATE / TIMESTAMP …)。精细到极致,为每一字节和每一次计算负责,代价是学习成本与建模复杂度。
  • Excel:弱类型、灵活多变,由它的通用性所决定。它是弱类型,单元格类型可随时改写,同一列能混装文本与数字。这不是缺陷,而是它作为"人人可用的通用工具"的通用性所决定的——代价是放弃了严格性。

一句话:类型太少是"偷懒",类型太多是"负担",Tableau 的五种是在"分析够用"与"不添乱"之间找到的平衡。

二、数据类型解析与转换(以 Tableau 为例)

所谓解析(parse),就是把"一种形态的串"识别、转换为"强类型字段"的过程。上一篇文章的正则只负责"提取子串"、得到纯文本;这一节的"解析"还要更进一步——赋予类型。

2.1 Tableau 解析 / 转换函数族

图3 Tableau 解析转换函数族地图
图:Tableau 解析转换函数族全景——DATEPARSE、INT、FLOAT、MAKEDATE、SPLIT、ISDATE 六族

按"输入 → 输出"分族来看:

  • 文本 → 日期:`DATE`、`DATETIME`、`DATEPARSE`(用格式串解析,最可控,本篇主角)。
  • 文本 ↔ 数值:`INT`(串→整)、`FLOAT`(串→浮)、`STR`(任意→串)。`INT` / `FLOAT` 是 `DATEPARSE` 在"数字侧"的亲兄弟。
  • 数字 → 构造日期:`MAKEDATE`、`MAKEDATETIME`、`MAKETIME`。当 `DATEPARSE` 不可用时(如 Hive 连接),用它们兜底。
  • 轻量拆分:`SPLIT`(按分隔符取第 n 段),不用正则也能拆 `a-b-c`。
  • 解析前校验:`ISDATE`(判断这串能否被解析成日期,是解析前的保险丝)。
  • 正则族:`REGEXP_EXTRACT` / `_NTH` / `_MATCH` / `_REPLACE`(见上一篇文章)。

2.2 重点:DATEPARSE(先看位置,再写格式)

DATEPARSE 不靠"猜",而是让你显式声明:字段里的哪一段是日、哪一段是月、哪一段是年、哪一段是时。官方把日期的四个部件标成 A / B / C / D:

  • A = Day of month(日)
  • B = Month(月)
  • C = Year(年)
  • D = Hour / Minute / Second / 上下午(时、分、秒、午前午后)

做法分两步:① 先在字段里看清 日 / 月 / 年 / 时 分别在哪个「位置」(A / B / C / D);② 再据此拼出格式串,让 Tableau 能照着把字符串"翻译"成日期。格式串必须原样复刻字符串里的空格、连字符等符号,否则会返回 Null。

图4 DATEPARSE:ABCD 位置 → 格式令牌
图:DATEPARSE 的核心思路——先用 ABCD 标出日期部件位置,再用格式令牌拼出格式串

看上图示例:字段 `15 - May - 2018 09:30 AM` 中,A(日)= `15`、B(月)= `May`、C(年)= `2018`、D(时)= `09:30 AM`;对应的格式令牌就是 `dd - MMM - yyyy hh:mm aa`。每个令牌认得自己对应哪个日期部件(dd = 日、MMM = 月、yyyy = 年、aa = 上下午),Tableau 就照这张"地图"把串变成日期。

解析自带的"智能":缺省日自动补 1、两位年 `25` 自动补世纪为 `2025`、非法值(如 13 月)自动校验失败;长写部件也能解析(`September` 用 `MMMM` 四个符号即可)。

进阶:季度字段怎么办? 若你的字段是季度格式(如 period 列的 `25.1Q`),可把 `.1` 当作季度而非月份,用单引号包住字面字母 Q:`DATE(DATEPARSE("yy.Q'Q'", [period]))` —— 解析为 `2025-01-01`(季度首月首日),外层 `DATE()` 去掉时分秒只留年月日。注意:格式串里的 `Q` 是"季度(Quarter)"的专用符号,文本里的字面字母 `Q` 必须写成 `'Q'`,否则会返回 Null。

2.3 类型转换方向一览

图5 Tableau 类型转换方向网络图
图:Tableau 类型转换方向一览——文本、日期、数值三极之间的转换路径
  • 文本 →(`DATEPARSE` / `DATE`)→ 日期
  • 文本 →(`INT` / `FLOAT`)→ 数值
  • 日期 / 数值 →(`STR`)→ 文本
  • 数字(年,月,日)→(`MAKEDATE`)→ 日期
  • 正则 `REGEXP_EXTRACT` 只产出文本,要变成日期 / 数值,仍需 `DATEPARSE` / `INT` 等"解析"一步

2.4 解析的代价与收益

  • 收益:类型化带来校验、日历语义、默认值(日=1、季度首月),拿到的是可计算字段。
  • 代价:比正则多一层"理解",格式串要与数据严格对齐。
  • 与正则的关系:正则像"找出来"(模式导向、只认字符),`DATEPARSE` 像"变成日期"(格式导向、带语义)。该上正则的地方(混乱如 `25.1U` / `26.5PK2`)还是得正则。

三、补充:SQL 中的 strftime(跨工具视野)

3.1 先澄清:strftime 严格说是 SQLite 的函数

它并非"所有 SQL 通用"。通用的是"日期格式化 / 解析函数"这一族,各数据库方言不同:

  • SQLite:`strftime(format, timestring, ...)`
  • MySQL:`DATE_FORMAT`(date→string)/ `STR_TO_DATE`(string→date)
  • PostgreSQL:`TO_CHAR`(date→string)/ `TO_DATE`(string→date)
  • SQL Server:`CONVERT` / `FORMAT`

3.2 strftime 是什么

它是 C 标准库 `strftime` 的 SQL 版,作用是 date → string(把日期格式化成串),格式符如 `%Y %m %d %H %M %S %q`(其中 `%q` = 季度,正好和 Tableau 的 `Q` 令牌遥相呼应)。

3.3 与 Tableau DATEPARSE 的关系:互为逆运算

图6 strftime 与 DATEPARSE 逆运算对照图
图:DATEPARSE(解析输入)与 strftime(格式化输出)互为逆运算
  • `DATEPARSE`:string → date(解析输入),对应 C 的 `strptime`。
  • `strftime` / `TO_CHAR` / `DATE_FORMAT`:date → string(格式化输出),对应 C 的 `strftime`。
  • 格式符对照:`%Y` ↔ `yyyy` / `yy`、`%m` ↔ `MM`、`%d` ↔ `dd`、`%q` ↔ `Q`。

3.4 一句话收束

解析 / 格式化是通用的"逆运算"思想:Tableau 用 `DATEPARSE` 把串变成日期,SQL 用 `strftime` 把日期变成串,二者方向相反、思想同源。理解了"类型"与"解析",你就能在任意工具间迁移这套认知。

结语:三句话形成知识闭环

1. 类型是基础——它预先定义了数据怎么存、能怎么算。

2. 解析 / 转换是桥——把混排文本变成可计算字段。

3. Tableau 与 SQL 共用同一套"逆运算"思想——提取、解析、转换,层层递进。

回到本系列第一篇《Tableau 正则表达式实战:从混合字符串里精准拆出「年.月」》,你就能把"提取 → 解析 → 类型"串成一条完整的认知线。

整条链路是:**提取**(正则把子串拿出来)→ **解析**(DATEPARSE 按位置与格式令牌转成日期)→ **类型**(转换方向决定了后面能做什么计算)。三篇连起来读,「把混排文本变成可计算字段」这件事就没有死角了。

No comments yet