Il serait plus simple si vous avez enregistré l'heure comme une heure d'intervalle à MINU TE. Ensuite, vous pouvez simplifier la première requête en utilisant:
DROP TABLE IF EXISTS rd_rt_date_integer;
CREATE TABLE rd_rt_date_integer
(
run_date DATE NOT NULL,
run_time INTERVAL HOUR TO MINUTE NOT NULL
CHECK (run_time >= INTERVAL(0:0) HOUR TO MINUTE AND run_time < INTERVAL(24:00) HOUR TO MINUTE),
PRIMARY KEY(run_date, run_time)
);
INSERT INTO rd_rt_date_integer VALUES('2017-05-22', '0:0');
INSERT INTO rd_rt_date_integer VALUES('2017-05-22', '1:00');
INSERT INTO rd_rt_date_integer VALUES('2017-05-22', '2:00');
INSERT INTO rd_rt_date_integer VALUES('2017-05-22', '3:00');
INSERT INTO rd_rt_date_integer VALUES('2017-05-22', '4:00');
SELECT run_date, run_time,
EXTEND(run_date, YEAR TO MINUTE) + run_time AS run_date_time
FROM rd_rt_date_integer;
Cependant, vous avez sans doute une raison d'utiliser l'entier run_time
, même si elle fait des calculs de temps infernales.
Ce code fonctionne - Je recommande d'utiliser la procédure stockée:
DROP TABLE IF EXISTS rd_rt_date_integer;
CREATE TABLE rd_rt_date_integer
(
run_date DATE NOT NULL,
run_time INTEGER NOT NULL
CHECK (run_time >= 0 AND run_time < 2400 AND MOD(run_time, 100) < 60),
PRIMARY KEY(run_date, run_time)
);
INSERT INTO rd_rt_date_integer VALUES('2017-05-22', 0);
INSERT INTO rd_rt_date_integer VALUES('2017-05-22', 100);
INSERT INTO rd_rt_date_integer VALUES('2017-05-22', 200);
INSERT INTO rd_rt_date_integer VALUES('2017-05-22', 300);
INSERT INTO rd_rt_date_integer VALUES('2017-05-22', 400);
SELECT run_date, run_time,
EXTEND(run_date, YEAR TO MINUTE) +
MOD(run_time, 100) UNITS MINUTE +
(run_time/100) UNITS HOUR AS run_date_time
FROM rd_rt_date_integer
WHERE EXTEND(run_date, YEAR TO MINUTE) +
MOD(run_time, 100) UNITS MINUTE +
(run_time/100) UNITS HOUR >= DATETIME(2017-05-22 02:00) YEAR TO MINUTE
OR EXTEND(run_date, YEAR TO MINUTE) +
MOD(run_time, 100) UNITS MINUTE +
(run_time/100) UNITS HOUR >= EXTEND('2017-05-22 02:00', YEAR TO MINUTE)
;
DROP FUNCTION IF EXISTS run_date_time;
CREATE FUNCTION run_date_time(rd DATE, rt INTEGER)
RETURNING DATETIME YEAR TO MINUTE;
DEFINE rv DATETIME YEAR TO MINUTE;
LET rv = EXTEND(rd, YEAR TO MINUTE) + MOD(rt, 100) UNITS MINUTE + (rt/100) UNITS HOUR;
RETURN rv;
END FUNCTION;
SELECT run_date, run_time,
run_date_time(run_date, run_time) AS run_date_time
FROM rd_rt_date_integer
WHERE run_date_time(run_date, run_time) >= DATETIME(2017-05-22 02:00) YEAR TO MINUTE
OR run_date_time(run_date, run_time) >= EXTEND('2017-05-22 02:00', YEAR TO MINUTE)
OR run_date_time(run_date, run_time) >= run_date_time('2017-05-22', 200)
;
Les OR
conditions dans les déclarations ultérieures SELECT montrent différentes pour l'écriture des nomenclatures la condition. Ils sont par ailleurs identiques et une seule des conditions est nécessaire; les autres sont superflus.
Si vous simplement mis en mémoire les minutes depuis minuit dans la colonne run_time
, plutôt que de coder comme 100 * hours + minutes
, alors vous pouvez écrire des expressions comme:
DATETIME(2017-06-12 00:00) YEAR TO MINUTE + 245 UNITS MINUTE
Cette expression évalue à 2017-06-12 04:05
. Vous pouvez facilement organiser la mise à jour de la table à cet encodage. Il existe des variantes évidentes de ceci, telles que:
EXTEND(TODAY, YEAR TO MINUTE) + 245 UNITS MINUTE
EXTEND(run_date, YEAR TO MINUTE) + run_time UNITS MINUTE