Informix - 结合日期和时间字段
Informix - Combining date and time field
我们从 informix 表中接收这种格式的数据
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
我想把两者结合起来得到日期时间,这样就可以进行操作了。请帮忙
;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
预期产出
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
该问题未识别 运行 日期和 运行 时间值的列类型。但是,运行 日期的合理类型是 DATE、DATETIME YEAR TO DAY 和 CHAR(10); 运行 时间的合理类型是 INTEGER 和 CHAR(4)。对于本练习,INTEGER 和 SMALLINT,或 CHAR(n) 和 VARCHAR(n) 之间没有区别,您可以(但不应该)在 运行 时间使用 DECIMAL。正确指定的问题可以避免这些问题。
幸运的是,这并不重要 — 相同的基本 SQL 代码可以处理上述所有变体 — 尽管您可能需要为一些更离奇的类型组合添加更多转换。
此代码假定您在环境中设置了 DBDATE="Y4MD-"
或等效设置;如果您同时使用 DATE 列和 $DBDATE
.
的不同值,则必须进行更改
日期加整数
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
)是必要的,因为优化器不会在将 run_date
视为 DATETIME
时,不知道要使用哪些 DATETIME
子类型。 (好的:所以 'myriad' 有点夸张。有 56 种不同的 DATETIME
子类型和其中一些类型的 7 个同义词。)
我们从 informix 表中接收这种格式的数据
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
我想把两者结合起来得到日期时间,这样就可以进行操作了。请帮忙
;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
预期产出
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
该问题未识别 运行 日期和 运行 时间值的列类型。但是,运行 日期的合理类型是 DATE、DATETIME YEAR TO DAY 和 CHAR(10); 运行 时间的合理类型是 INTEGER 和 CHAR(4)。对于本练习,INTEGER 和 SMALLINT,或 CHAR(n) 和 VARCHAR(n) 之间没有区别,您可以(但不应该)在 运行 时间使用 DECIMAL。正确指定的问题可以避免这些问题。
幸运的是,这并不重要 — 相同的基本 SQL 代码可以处理上述所有变体 — 尽管您可能需要为一些更离奇的类型组合添加更多转换。
此代码假定您在环境中设置了 DBDATE="Y4MD-"
或等效设置;如果您同时使用 DATE 列和 $DBDATE
.
日期加整数
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
)是必要的,因为优化器不会在将 run_date
视为 DATETIME
时,不知道要使用哪些 DATETIME
子类型。 (好的:所以 'myriad' 有点夸张。有 56 种不同的 DATETIME
子类型和其中一些类型的 7 个同义词。)