2017-06-13 4 views
0

Voir ci-dessous requête:Informix - Date/Time Manipulation dans where

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; 

Question: Comment peut-on appliquer la condition énoncée dans où la clause de récupérer les données de certaine heure

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 >='2017-05-22 02:00' 

Je viens veux comprendre quelle est la meilleure façon de faire la manipulation dans où clause elle-même où im concaténation run_date et run_time ...

Répondre

1

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