簡體   English   中英

PostgreSQL 10日期范圍約束

[英]postgresql 10 date range contraint

我想在postgresql 10中設置日期范圍約束。在postgresql 9.6中,此方法有效:

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

如何使該約束起作用?

start_timeend_time列的類型為TIMESTAMP ,而tstzrange期望的是TIMESTAMPTZ (帶有時區)。 顯然,這種轉換是自動發生的,但它不被認為是“不可改變的”。

在文檔https://www.postgresql.org/docs/10/static/xfunc-volatility.html

一個常見的錯誤是標記的函數IMMUTABLE當其結果取決於配置參數。 例如,一個操作時間戳的函數可能有依賴於timezone設置的結果。 出於安全考慮,這樣的函數應該標記為穩定。

你或許應該使用tsrange代替,或顯式轉換與時區時間戳(在不依賴於服務器設置的方式):

tstzrange(start_time at time zone 'utc', COALESCE(end_time at time zone 'utc', 'infinity')) WITH &&

我不知道是什么版本之間改變了,雖然(我也得到了同樣的錯誤消息9.6.6)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM