Sto creando un database che memorizza intervalli di data/ora arbitrari in PostgreSQL 9.2.4. Voglio posizionare un vincolo su questo database che costringe gli intervalli di data/ora a non sovrapporsi e non adiacenti (poiché due intervalli adiacenti possono essere espressi come un unico intervallo continuo).Prevenzione di voci adiacenti/sovrapposte con EXCLUDE in PostgreSQL
Per fare ciò, sto utilizzando un vincolo EXCLUDE
con un indice GiST. Qui è il vincolo ho attualmente:
ADD CONSTRAINT overlap_exclude EXCLUDE USING GIST (
box(
point (
extract(EPOCH FROM "from") - 1,
extract(EPOCH FROM "from") - 1
),
point (
extract(EPOCH FROM "to"),
extract(EPOCH FROM "to")
)
) WITH &&
);
Le colonne from
e to
sono entrambi TIMESTAMP WITHOUT TIME ZONE
, e sono data/orari memorizzati in UTC (I convertire in UTC prima di inserire i dati in queste colonne nella mia richiesta, e ho Il fuso orario del mio database è impostato su "UTC" in postgresql.conf).
Il problema che sto pensando di avere, tuttavia, è che questo vincolo sta facendo l'assunzione (errata) che non ci siano incrementi di tempo inferiori a un secondo.
Vale la pena notare che, per i dati particolari che sto memorizzando, ho solo bisogno di una seconda risoluzione. Tuttavia, ritengo che possa ancora essere necessario occuparsi di questo poiché i tipi di SQL timestamp
e timestamptz
sono entrambi risoluzione più alta di un secondo.
La mia domanda è: c'è qualche problema con la semplice assunzione di una seconda risoluzione, poiché è tutto ciò che la mia applicazione ha bisogno (o vuole), o, se c'è, come posso modificare questo vincolo per trattare le frazioni-di-a -secondo in modo robusto?
+1 per l'operatore adiacente. –
Questa soluzione funzionerà molto bene. Anche se avrei potuto simularlo usando colonne separate, passare a 'tsrange 'lo rende banale, ** e ** mi dà tutti gli altri operatori di intervallo, che saranno molto utili per l'utilizzo/la gestione di questi dati. Grazie! :) – CmdrMoozy