加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – Postgres日期重叠约束

发布时间:2020-12-12 16:52:25 所属栏目:MsSql教程 来源:网络整理
导读:我有这样的表: date_start date_end account_id product_id2001-01-01 2001-01-31 1 12001-02-01 2001-02-20 1 12001-04-01 2001-05-20 1 1 我想禁止给定的重叠间隔(account_id,product_id) 编辑:我找到了一些东西: CREATE TABLE test ( from_ts TIMESTAMP
我有这样的表:
date_start    date_end     account_id    product_id
2001-01-01    2001-01-31   1             1
2001-02-01    2001-02-20   1             1
2001-04-01    2001-05-20   1             1

我想禁止给定的重叠间隔(account_id,product_id)

编辑:我找到了一些东西:

CREATE TABLE test (                                                                                                
    from_ts TIMESTAMPTZ,to_ts TIMESTAMPTZ,account_id INTEGER,product_id INTEGER,CHECK ( from_ts < to_ts ),CONSTRAINT overlapping_times EXCLUDE USING GIST (
        account_id WITH =,product_id WITH =,box(
            point( extract(epoch FROM from_ts at time zone 'UTC'),extract(epoch FROM from_ts at time zone 'UTC') ),point( extract(epoch FROM to_ts at time zone 'UTC'),extract(epoch FROM to_ts at time zone 'UTC') )
        ) WITH &&
    )
);

如果你想更多地了解这个http://www.depesz.com/2010/01/03/waiting-for-8-5-exclusion-constraints/

我唯一的问题是它不能使用空值作为结束时间戳,我认为用无限值替换它,但不起作用.

解决方法

好的,我最终这样做:
CREATE TABLE test (
    from_ts TIMESTAMPTZ,account_id INTEGER DEFAULT 1,product_id INTEGER DEFAULT 1,period(from_ts,CASE WHEN to_ts IS NULL THEN 'infinity' ELSE to_ts END) WITH &&
    )
);

完美无瑕,交易证明.

我只需要安装临时扩展,这将在postgres 9.2中是本地的,btree_gist可以作为9.1中的扩展CREATE EXTENSION btree_gist;

nb:如果没有空时间戳,那么就不需要使用我可以用我的问题中指定的方框的方法来使用时间扩展.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读