Küsimus
Vastus (14.10.2022 10:45):
PostgreSQLi DATE ja TIMESTAMP tüüpidesse kuuluvad spetsiaalväärtused 'infinity' (suurem kui kõik ülejäänud DATE/TIMESTAMP väärtused) ja '-infinity' (väiksem kui kõik ülejäänud DATE/TIMESTAMP väärtused).
Need lihtsustavad päringute tegemist.
Tabelis Kasutus_1 on kasutusel, mille lõpu aeg pole teada, lõpu aja väli tühi (seal väljas on NULL). CREATE TABLE Kasutus_1 (kasutus_1_id SERIAL,ruumi_nr INTEGER NOT NULL,alguse_aeg TIMESTAMP NOT NULL,lopu_aeg TIMESTAMP,CONSTRAINT pk_kasutus_1 PRIMARY KEY (kasutus_1_id),CONSTRAINT ak_kasutus_1 UNIQUE (ruumi_nr, alguse_aeg));INSERT INTO Kasutus_1 (ruumi_nr, alguse_aeg) VALUES (1, '2022-10-04 12:00'), (2, '2022-10-04 12:00');INSERT INTO Kasutus_1 (ruumi_nr, alguse_aeg, lopu_aeg) VALUES (1, '2021-11-04 12:00', '2021-11-04 14:00'), (3, '2021-11-04 12:00', '2028-11-04 12:00');
Tabelis Kasutus_2 on kasutusel, mille lõpu aeg pole teada, lõpu aja väljas väärtus 'infinity'.CREATE TABLE Kasutus_2 (kasutus_2_id SERIAL,ruumi_nr INTEGER NOT NULL,alguse_aeg TIMESTAMP NOT NULL,lopu_aeg TIMESTAMP NOT NULL DEFAULT 'infinity',CONSTRAINT pk_kasutus_2 PRIMARY KEY (kasutus_2_id),CONSTRAINT ak_kasutus_2 UNIQUE (ruumi_nr, alguse_aeg));INSERT INTO Kasutus_2 (ruumi_nr, alguse_aeg) VALUES (1, '2022-10-04 12:00'), (2, '2022-10-04 12:00');INSERT INTO Kasutus_2 (ruumi_nr, alguse_aeg, lopu_aeg) VALUES (1, '2021-11-04 12:00', '2021-11-04 14:00'), (3, '2021-11-04 12:00', '2028-11-04 12:00');
Leia hetkel toimuvad kasutused.
Päring juhul kui lõpu aeg võib olla NULL.SELECT *FROM Kasutus_1WHERE (LOCALTIMESTAMP BETWEEN alguse_aeg AND lopu_aeg)OR (alguse_aeg<=LOCALTIMESTAMP AND lopu_aeg IS NULL);
Päring juhul kui teadmata lõpu aega tähistab spetsiaalväärtus 'infinity'.SELECT *FROM Kasutus_2WHERE (LOCALTIMESTAMP BETWEEN alguse_aeg AND lopu_aeg);