如何使用 informix 11.5 中的存储过程将时间范围分成几天?
How do I split a time range into days using stored procedure in informix 11.5?
我在 informix 11.5 中遇到将时间范围拆分为天数的问题。我的要求是,我将获得两个日期,例如 06/05/2015 11:00:00 至 06/07/2015 03:30:00。
我必须在存储过程中将这些时间范围拆分为以下内容,
- 06/05/2015 11:00:00 - 06/05/2015 23:59:59
- 06/06/2015 00:00:00 - 06/06/2015 23:59:59
- 06/07/2015 00:00:00 - 06/07/2015 03:30:00
我不熟悉 informix 中的存储过程。非常感谢您的帮助。
有多种方法可以实现,具体取决于您希望如何使用这些值。这是一种可行的方法:
CREATE PROCEDURE split_date_range(t0 DATETIME YEAR TO SECOND,
t1 DATETIME YEAR TO SECOND)
RETURNING DATETIME YEAR TO SECOND AS t_begin,
DATETIME YEAR TO SECOND AS t_end;
DEFINE tb DATETIME YEAR TO SECOND;
DEFINE te DATETIME YEAR TO SECOND;
DEFINE d1 DATE;
DEFINE de DATE;
DEFINE msg VARCHAR(72);
IF t0 IS NULL OR t1 IS NULL THEN
RAISE EXCEPTION -746, 0, "NULL value passed where not permitted";
END IF;
IF t0 > t1 THEN
LET msg = "t0 = " || t0 || " should not be bigger than t1 " || t1;
RAISE EXCEPTION -746, 0, msg;
END IF;
IF EXTEND(t0, YEAR TO DAY) = EXTEND(t1, YEAR TO DAY) THEN
RETURN t0, t1;
ELSE
LET te = EXTEND(EXTEND(t0, YEAR TO DAY), YEAR TO SECOND) +
INTERVAL(23:59:59) HOUR TO SECOND;
RETURN t0, te WITH RESUME;
LET d1 = DATE(EXTEND(t0, YEAR TO DAY)) + 1;
LET de = DATE(EXTEND(t1, YEAR TO DAY));
WHILE d1 < de
LET tb = EXTEND(d1, YEAR TO SECOND);
LET te = tb + INTERVAL(23:59:59) HOUR TO SECOND;
RETURN tb, te WITH RESUME;
LET d1 = d1 + 1;
END WHILE;
LET tb = EXTEND(d1, YEAR TO DAY);
RETURN tb, t1;
END IF;
END PROCEDURE;
显示的基本逻辑是:
- 检查有效调用。 (错误消息可能应该包含函数名称以便更好地跟踪。错误 -746 用于用户定义的消息。SQLCA 的 SQLERRM 元素的大小(错误消息结束的位置)为 72,因此 VARCHAR(72) .)
- 如果开始和结束时间在同一天,则returns这两个值。
- 否则returns同一天的开始时间和结束时间(WITH RESUME表示再次调用时会继续),
- 然后对于开始时间之后和结束日期之前的每一天,它 returns 一天的开始和结束,
- 最后一天,returns 午夜和结束日期的结束时间。
然后您可以使用类似的东西:
EXECUTE PROCEDURE split_date_range(DATETIME(2015-06-05 11:00:00) YEAR TO SECOND,
DATETIME(2015-06-07 03:30:00) YEAR TO SECOND));
生成:
t_begin t_end
2015-06-05 11:00:00 2015-06-05 23:59:59
2015-06-06 00:00:00 2015-06-06 23:59:59
2015-06-07 00:00:00 2015-06-07 03:30:00
我在 informix 11.5 中遇到将时间范围拆分为天数的问题。我的要求是,我将获得两个日期,例如 06/05/2015 11:00:00 至 06/07/2015 03:30:00。 我必须在存储过程中将这些时间范围拆分为以下内容,
- 06/05/2015 11:00:00 - 06/05/2015 23:59:59
- 06/06/2015 00:00:00 - 06/06/2015 23:59:59
- 06/07/2015 00:00:00 - 06/07/2015 03:30:00
我不熟悉 informix 中的存储过程。非常感谢您的帮助。
有多种方法可以实现,具体取决于您希望如何使用这些值。这是一种可行的方法:
CREATE PROCEDURE split_date_range(t0 DATETIME YEAR TO SECOND,
t1 DATETIME YEAR TO SECOND)
RETURNING DATETIME YEAR TO SECOND AS t_begin,
DATETIME YEAR TO SECOND AS t_end;
DEFINE tb DATETIME YEAR TO SECOND;
DEFINE te DATETIME YEAR TO SECOND;
DEFINE d1 DATE;
DEFINE de DATE;
DEFINE msg VARCHAR(72);
IF t0 IS NULL OR t1 IS NULL THEN
RAISE EXCEPTION -746, 0, "NULL value passed where not permitted";
END IF;
IF t0 > t1 THEN
LET msg = "t0 = " || t0 || " should not be bigger than t1 " || t1;
RAISE EXCEPTION -746, 0, msg;
END IF;
IF EXTEND(t0, YEAR TO DAY) = EXTEND(t1, YEAR TO DAY) THEN
RETURN t0, t1;
ELSE
LET te = EXTEND(EXTEND(t0, YEAR TO DAY), YEAR TO SECOND) +
INTERVAL(23:59:59) HOUR TO SECOND;
RETURN t0, te WITH RESUME;
LET d1 = DATE(EXTEND(t0, YEAR TO DAY)) + 1;
LET de = DATE(EXTEND(t1, YEAR TO DAY));
WHILE d1 < de
LET tb = EXTEND(d1, YEAR TO SECOND);
LET te = tb + INTERVAL(23:59:59) HOUR TO SECOND;
RETURN tb, te WITH RESUME;
LET d1 = d1 + 1;
END WHILE;
LET tb = EXTEND(d1, YEAR TO DAY);
RETURN tb, t1;
END IF;
END PROCEDURE;
显示的基本逻辑是:
- 检查有效调用。 (错误消息可能应该包含函数名称以便更好地跟踪。错误 -746 用于用户定义的消息。SQLCA 的 SQLERRM 元素的大小(错误消息结束的位置)为 72,因此 VARCHAR(72) .)
- 如果开始和结束时间在同一天,则returns这两个值。
- 否则returns同一天的开始时间和结束时间(WITH RESUME表示再次调用时会继续),
- 然后对于开始时间之后和结束日期之前的每一天,它 returns 一天的开始和结束,
- 最后一天,returns 午夜和结束日期的结束时间。
然后您可以使用类似的东西:
EXECUTE PROCEDURE split_date_range(DATETIME(2015-06-05 11:00:00) YEAR TO SECOND,
DATETIME(2015-06-07 03:30:00) YEAR TO SECOND));
生成:
t_begin t_end
2015-06-05 11:00:00 2015-06-05 23:59:59
2015-06-06 00:00:00 2015-06-06 23:59:59
2015-06-07 00:00:00 2015-06-07 03:30:00