2017-06-13 12 views
0

は、クエリの下を参照してくださいどこで:のInformix - 日付/時刻の操作句

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; 

は質問:どのように私たちが句に一定の時間からデータを取得する場所に条件を適用することができます以降

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' 

私はちょうどwhere節で操作を行う最善の方法を理解したい場合は、run_dateとrun_timeを連結します。

答えて

1

時間をMINUに渡すと簡単になりますTE。 は、その後、使用して最初のクエリを簡素化できます。

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; 

しかし、あなたはおそらく、それは時間の計算が地獄になりにもかかわらず、整数​​を使用する理由を持っています。

このコードは動作します - 私は、ストアドプロシージャ使用することをお勧めします:

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) 
; 

後のSELECT文でOR条件が条件を記述するための別の命名法を表示します。それらはそれ以外の点では同一であり、条件の1つだけが必要です。他は余分です。式が2017-06-12 04:05に評価さ

DATETIME(2017-06-12 00:00) YEAR TO MINUTE + 245 UNITS MINUTE 

:あなたは、単にあなたがのような式を書くことができ、むしろ100 * hours + minutesとしてそれをコードするよりも、​​欄に午前0時からの分を保存した場合

。このエンコーディングにテーブルを簡単にアレンジすることができます。これには明らかなバリエーションがあります:

EXTEND(TODAY, YEAR TO MINUTE) + 245 UNITS MINUTE 
EXTEND(run_date, YEAR TO MINUTE) + run_time UNITS MINUTE