Informix - 组合日期和时间字段

时间:2017-05-23 11:13:21

标签: sql-server informix

我们从informix tables

接收这种格式的数据
Run Date        Run Time
2017-05-22        0
2017-05-22        100
2017-05-22        200
2017-05-22        300
2017-05-22        400

预期产出:

2017-05-22 04:00

我希望将两者结合起来获取日期时间,以便可以进行操作。请帮忙。

2 个答案:

答案 0 :(得分:0)

;With Cte(RunDate,RunTime)
AS
(
SELECT '2017-05-22',0   UNION ALL
SELECT '2017-05-22',100 UNION ALL
SELECT '2017-05-22',200 UNION ALL
SELECT '2017-05-22',300 UNION ALL
SELECT '2017-05-22',400
)

SELECT CONCAT( RunDate,' ',ISNULL(STUFF(Right('0' + CAST(RunTime AS VARCHAr(10)),6),3,LEn(RunTime),''),'00')+' : 00')Expected from Cte

预期OutPut

2017-05-22 00 : 00
2017-05-22 01 : 00
2017-05-22 02 : 00
2017-05-22 03 : 00
2017-05-22 04 : 00

答案 1 :(得分:0)

该问题未确定运行日期和运行时值的列类型。但是,运行日期的合理类型是DATE,DATETIME YEAR TO DAY和CHAR(10);运行时间的合理类型是INTEGER和CHAR(4)。对于本练习,INTEGER和SMALLINT或CHAR(n)和VARCHAR(n)之间没有区别,您可以(但不应该)在运行时使用DECIMAL。正确指定的问题可以避免这些问题。

幸运的是,它并不重要 - 相同的基本SQL代码处理上面的所有变体 - 尽管你可能需要为一些更为outré类型的组合添加更多的强制转换。

此代码假设您在环境中设置了DBDATE="Y4MD-"或等效设置;如果您同时使用DATE列和$DBDATE的其他值,则必须进行更改。

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;

示例输出

run_date    run_time    run_date_time
DATE        INTEGER     DATETIME YEAR TO MINUTE
2017-05-22  0           2017-05-22 00:00
2017-05-22  100         2017-05-22 01:00
2017-05-22  200         2017-05-22 02:00
2017-05-22  300         2017-05-22 03:00
2017-05-22  400         2017-05-22 04:00

CHAR加CHAR

DROP TABLE IF EXISTS rd_rt_char_char;
CREATE TABLE rd_rt_char_char
(
    run_date    CHAR(10) NOT NULL
                CHECK (run_date MATCHES '[0-9][0-9][0-9][0-9]-[01][0-9]-[0-3][0-9]'),
    run_time    CHAR(4) NOT NULL,
    PRIMARY KEY(run_date, run_time)
);

INSERT INTO rd_rt_char_char VALUES('2017-05-22', '0');
INSERT INTO rd_rt_char_char VALUES('2017-05-22', '100');
INSERT INTO rd_rt_char_char VALUES('2017-05-22', '200');
INSERT INTO rd_rt_char_char VALUES('2017-05-22', '300');
INSERT INTO rd_rt_char_char VALUES('2017-05-22', '400');

SELECT run_date, run_time,
       EXTEND(run_date::DATE, YEAR TO MINUTE) +
       MOD(run_time, 100) UNITS MINUTE +
       (run_time / 100) UNITS HOUR AS run_date_time
  FROM rd_rt_char_char;

示例输出

run_date    run_time    run_date_time
CHAR(10)    CHAR(4)     DATETIME YEAR TO MINUTE
2017-05-22  0           2017-05-22 00:00
2017-05-22  100         2017-05-22 01:00
2017-05-22  200         2017-05-22 02:00
2017-05-22  300         2017-05-22 03:00
2017-05-22  400         2017-05-22 04:00

在大多数情况下,Informix非常适合在类型之间自动转换 - 这里需要转换为DATE(可能是DATETIME YEAR TO DAY),因为优化器不知道将DATETIME视为run_date时要使用的无数DATETIME子类型中的哪一个。 (好的:所以'无数'是夸张的。有些类型有56种不同的DATETIME子类型和7种同义词。)