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_1
WHERE (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_2
WHERE (LOCALTIMESTAMP BETWEEN alguse_aeg AND lopu_aeg); |