Tableau关系创建时DATEPARSE失效,求日期转换方案及SQL实现
解决Tableau自定义SQL表关系中日期转换的替代方案
一、Tableau计算字段替代方法
当无法使用DATEPARSE时,可通过字符串截取+日期函数组合实现转换,同时适配6位(yyyyMM)和4位(yyyy)两种格式:
IF LEN(STR([DATE])) = 6 THEN DATEADD('month', INT(RIGHT(STR([DATE]),2)) - 1, DATE("01/01/" + LEFT(STR([DATE]),4))) ELSEIF LEN(STR([DATE])) = 4 THEN DATE("01/01/" + STR([DATE])) END
- 逻辑说明:6位格式取前4位为年份、后2位为月份,通过
DATEADD偏移到对应月份的第一天;4位格式直接转换为当年1月1日,后续Tableau可自动渲染为Jan 2022这类显示格式。
二、SQL层面直接转换(按数据库类型区分)
在自定义SQL里提前完成日期转换,规避Tableau计算环节的限制,以下是主流数据库的实现代码:
MySQL
CASE WHEN LENGTH(`DATE`) = 6 THEN STR_TO_DATE(`DATE`, '%Y%m') WHEN LENGTH(`DATE`) = 4 THEN STR_TO_DATE(CONCAT(`DATE`, '01'), '%Y%m') END AS standard_date
SQL Server
CASE WHEN LEN([DATE]) = 6 THEN CONVERT(DATE, [DATE], 112) WHEN LEN([DATE]) = 4 THEN CONVERT(DATE, CONCAT([DATE], '0101'), 112) END AS standard_date
注:112是SQL Server中yyyyMMdd格式的转换代码
PostgreSQL
CASE WHEN LENGTH("DATE") = 6 THEN TO_DATE("DATE", 'YYYYMM') WHEN LENGTH("DATE") = 4 THEN TO_DATE(CONCAT("DATE", '01'), 'YYYYMM') END AS standard_date
Oracle
CASE WHEN LENGTH(date_col) = 6 THEN TO_DATE(date_col, 'YYYYMM') WHEN LENGTH(date_col) = 4 THEN TO_DATE(CONCAT(date_col, '01'), 'YYYYMM') END AS standard_date
注:Oracle中DATE是关键字,建议字段名改为date_col这类非关键字名称
内容的提问来源于stack exchange,提问作者Floki_Sand
相关产品推荐
相关产品推荐

