Search code examples
postgresqlunique-constraintsql-timestamp

Applying unique constraint of date on TIMESTAMP column in postgresql


I have a postgresql table as

CREATE TABLE IF NOT EXISTS table_name
(
    expiry_date DATE NOT NULL,
    created_at TIMESTAMP with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP(0),
    CONSTRAINT user_review_uniq_key UNIQUE (expiry_date, created_at::date) -- my wrong attempt of using ::
)

I want to put uniue constraint on this table in such a way that expiry_date and date of created_at should be unique. Problem is created_at column is timestamp not date.

so is there any way to put unique constraint such that expire_date and created_at::date should be unique?

My attempt was to use
CONSTRAINT user_review_uniq_key UNIQUE (expiry_date, created_at::date) which is not valid.


Solution

  • If you do not need a time zone for your created date : create a unique index has follows :

    create unique index idx_user_review_uniq_key on  table_name (expiry_date, cast(created_at as date));
    

    If you need that badly to have a time zone then you need to use a little trick (https://gist.github.com/cobusc/5875282) :

    create unique index idx_user_review_uniq_key on  table_name (expiry_date, date(created_at at TIME zone 'UTC'));