将具有日期和纪元格式值的字符串列转换为 postgresql/Tableau prep 中的日期列

Posted

技术标签:

【中文标题】将具有日期和纪元格式值的字符串列转换为 postgresql/Tableau prep 中的日期列【英文标题】:Transform a string column that has date and epoch format values into a date column in postgresql/Tableau prep 【发布时间】:2021-02-14 11:02:37 【问题描述】:

如何将具有日期和纪元格式值的字符串列转换为日期列?我正在开发一个 postgresql / Tableau 准备环境。

Please find attached the example here

好的,这个查询有效:

SELECT case 
WHEN len(d.properties__renewal_date__value) > 10 
THEN (timestamp 'epoch' + CAST(NULLIF(d.properties__renewal_date__value, '') AS BIGINT)/1000 * interval '1 second')
ELSE to_date(d.properties__renewal_date__value, 'DD/MM/YYYY') end as renewal_date

【问题讨论】:

请将值复制并粘贴到您的问题中,而不是使用链接图像。我想说解决这个问题的方法是创建一个新的date 列并将现有列中的值转换为它。日期格式可以是DD/MM/YYYY::date。纪元为to_timestamp ( epoch_value)::date。区分它们可能需要使用正则表达式来完成,我不知道。 【参考方案1】:

这是@AdrianKlaver 评论的编码。首先通过正则表达式匹配确定当前值的类型,然后进行相应的转换。

select case 
   when "renewal date" ~ '^\d+$' then to_timestamp("renewal date"::double precision)::date
   else to_date("renewal date", 'dd/mm/yyyy')
 end as renewal_date
 from _table;

红移风味,以毫秒为单位的纪元值:

select case 
  when "renewal date" ~ '^\d+$' then 
    ('1970-01-01'::date + ("renewal date"::double precision/1000) * '1 second'::interval)::date
  else 
    to_date("renewal date", 'dd/mm/yyyy')
  end as renewal_date
  from _table;

【讨论】:

这很酷。不过,日期格式值的 to_date 是不必要的。你可以做"renewal date"::date; @AdrianKlaver 是的,你是对的。我更喜欢 to_date 格式,因为它更安全,因为它不依赖于SET DATESTYLE 配置。 确实如此。 我试过上面的代码,我得到这个错误:无效操作:函数to_timestamp(numeric)不存在;你知道为什么吗? 我的遗漏。函数定义是 to_timestamp(double precision) 或根本没有强制转换,不是数字。请。使用to_timestamp("renewal date"::double precision)::date。我注意到虽然 1553817600000 是一个 非常大 的纪元值并且产生 51208-07-09。 to_timestamp("renewal date"::double precision/1000)::date 产生 21 世纪的日期。也许时代值以毫秒为单位?

以上是关于将具有日期和纪元格式值的字符串列转换为 postgresql/Tableau prep 中的日期列的主要内容,如果未能解决你的问题,请参考以下文章

日期时间字符串到纪元:熊猫数据框

将字符串列转换为日期时间格式

从字符串转换为日期时间时获取常规日期时间格式而不是纪元时间?

Javascript将日期时间字符串转换为纪元

将纪元时间转换为熊猫数据框中的格式化日期字符串

将 UTC 纪元转换为本地日期