首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >postgresql 10日期范围对比

postgresql 10日期范围对比
EN

Stack Overflow用户
提问于 2018-03-19 20:44:56
回答 1查看 407关注 0票数 0

我想在postgresql 10中设置一个日期范围约束。

代码语言:javascript
运行
复制
CREATE TABLE project_lines (
  id SERIAL PRIMARY KEY,
  project_id INTEGER NOT NULL REFERENCES projects(id),
  description VARCHAR(200) NOT NULL,
  start_time TIMESTAMP NOT NULL,
  end_time TIMESTAMP CHECK(end_time > start_time),
  created_at TIMESTAMP NOT NULL DEFAULT NOW(),
  CONSTRAINT overlapping_times EXCLUDE USING GIST(
    project_id WITH =,
    tstzrange(start_time, COALESCE(end_time, 'infinity')) WITH &&
  )
);

但是在postgresql 10中,我得到了以下错误:

functions in index expression must be marked IMMUTABLE

如何使这个约束有效?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-19 21:35:14

start_timeend_time列具有TIMESTAMP类型,而tstzrange需要TIMESTAMPTZ (带时区)。显然,这种转换是自动发生的,但它并不被认为是“不可变的”。

https://www.postgresql.org/docs/10/static/xfunc-volatility.html的文件上说

一个常见的错误是,当函数的结果取决于配置参数时,将其标记为不可变函数。例如,操纵时间戳的函数很可能具有依赖于TimeZone设置的结果。为了安全起见,这些功能应该被标记为稳定的。

您可能应该使用tsrange,或者使用时区显式转换为时间戳(以不依赖于服务器设置的方式):

代码语言:javascript
运行
复制
tstzrange(start_time at time zone 'utc', COALESCE(end_time at time zone 'utc', 'infinity')) WITH &&

不过,我不知道不同版本之间发生了什么变化(我也得到了9.6.6的相同错误消息)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49372093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档