将具有日期和纪元格式值的字符串列转换为 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 中的日期列的主要内容,如果未能解决你的问题,请参考以下文章