如何使用 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。 我必须在存储过程中将这些时间范围拆分为以下内容,

  1. 06/05/2015 11:00:00 - 06/05/2015 23:59:59
  2. 06/06/2015 00:00:00 - 06/06/2015 23:59:59
  3. 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