【发布时间】:2021-12-31 03:58:41
【问题描述】:
我有一个名为statdate 的timestamp with time zone 字段,条目看起来像这样2021-11-17 12:47:54-08。我想创建一个仅在本地表达时间的字段,因此它看起来像12:47:54。 (此数据记录在 iPhone 上,时间为太平洋标准时间 12:28)。 (使用@AdrianKalver 的视图转到帖子底部以获取解决方案)
select *,statdate :: timestamp :: time as stattime from table
在 PGAdmin 中工作,示例结果是 12:47:54 根据需要。我如何使它成为一个改变表
ALTER TABLE tablename add COLUMN stattime timestamp generated always AS (select *,statdate :: timestamp :: time as stattime from tablename) stored;
语法错误。
ALTER TABLE tablename add COLUMN stattime timestamp generated always AS ( EXTRACT(HOUR FROM statdate) || ':' || EXTRACT(MINUTE FROM statdate) || ':' || EXTRACT(SECOND FROM statdate)) stored;
ERROR: generation expression is not immutable 我认为这是一个类型问题,尽管 postgres 可以使用这种语法连接字符串和数字。
刚刚尝试了其他方法
ALTER TABLE tablename add COLUMN stattime timestamp generated always AS ( Cast(EXTRACT(HOUR FROM statdate) as text) || ':' || cast(EXTRACT(MINUTE FROM statdate) as text) || ':' || cast(EXTRACT(SECOND FROM statdate) as text) ) stored; -- ERROR: generation expression is not immutable
我在图表中使用小时和分钟,但无法进入 Chartkick 中间。可以在高图表中做到这一点,但认为创建视图图表并使用它会更简单。 Rails/Chartkick 看起来像
<%= line_chart TableName.where(statdate: start..current_date).pluck(:statdate, :y_axis) %>
并且无法将其分开。创建一个视图表也是如此。
这样做的正确方法是什么?我已经查看了这里和 postgresql 文档,但运气不佳。
按照cmets,解决办法
CREATE OR REPLACE VIEW public.view_bp_with_time AS
SELECT
id,
statdate,
statdate :: time AS stattime,
y-axis
FROM table_name
ORDER BY statdate
现在引入 Rails。没有我想的那么简单。我下周不用电脑了。
【问题讨论】:
-
看起来您正在尝试通过更改其列类型来
REPLACE和VIEW。那是行不通的。在psql中\d public.view_bp_with_time返回什么?仅供参考,time with time zone几乎没用,只需使用time。 -
另外,如果
statdate是timestamp with time zone,你所要做的就是statdate::time。 -
我猜是因为您正在对一个已经存在的视图执行
... REPLACE VIEW public.view_bp_with_time并且将stattime作为文本字段。\d public.view_bp_with_time应该告诉你。如果是这种情况,您将需要DROP视图并运行您的新CREATE OR REPLACE VIEW public.view_bp_with_time ... -
不,不要
DROP桌子,DROP视图。 -
我的错,我错过了。应该只是
statdate :: time AS stattime行,而不是SELECT。
标签: ruby-on-rails postgresql datetime concatenation generated-columns