1

我想从 c# 调用下面的 informix sp,但无法编译它。我想向它传递一个像'2012-11-22'这样的字符串和两次像'08:15:00'这样的字符串,并将它们转换为一个日期和两个日期时间,但我似乎找不到正确的informix函数。我花了一整天的时间试图弄清楚这一点,感谢任何帮助。

不确定下面的代码是否会编译,因为我必须删除一些敏感部分,但我希望它足以给你这个想法。

我认为 TO_DATE 函数不正确

create procedure up_myproc(
calndr_dt CHAR(15)
, actvty_typ CHAR(5)
, actvty_start_tm CHAR(15)
, actvty_end_tm CHAR(15)
, actvty_cap SMALLINT
)

DEFINE calendar_activity_id int;
DEFINE activity_details_id int;

-- calendar activity
insert into caa61140 (
caa61140001
, caa61140004
, caa61140005
)
values (
0
, org_id
, DATE(calndr_dt)
);

LET calendar_activity_id = DBINFO('sqlca.sqlerrd1');

-- activity details
insert into caa61240 (
caa61240001
, caa61240002
, caa61240003
, caa61240004
)
values (
0
,calendar_activity_id
, TO_DATE(actvty_start_tm, "%H:%M" )
, TO_DATE (actvty_end_tm, "%H:%M" )
);

LET activity_details_id = DBINFO('sqlca.sqlerrd1');

-- calendar matter
insert into caa61340(caa61340001
, caa61340002)
SELECT activity_details_id
, caa60840003 matter_typ
  FROM caa60840 -- valid matter types;
  WHERE caa60840001=org_id
  AND caa60840002=actvty_typ;

end procedure;
4

1 回答 1

1

我解决这个问题的方法是使用 Informix 的隐式转换功能:

CREATE PROCEDURE up_myproc(
    calndr_dt       DATETIME YEAR TO DAY,
    actvty_typ      CHAR(5),
    actvty_start_tm INTERVAL HOUR TO SECOND,
    actvty_end_tm   INTERVAL HOUR TO SECOND,  
    actvty_cap      SMALLINT)

    DEFINE tm_1 DATETIME YEAR TO SECOND;
    DEFINE tm_2 DATETIME YEAR TO SECOND;

    LET tm_1 = EXTEND(clndr_dt, YEAR TO SECOND) + actvty_start_tm;
    LET tm_2 = EXTEND(clndr_dt, YEAR TO SECOND) + actvty_end_tm;

    ...

这里的关键决定是将时间视为 INTERVAL HOUR TO MINUTE 而不是 DATETIME HOUR TO MINUTE。如果您有正式的 DATETIME HOUR TO MINUTE 参数,则需要转换为 INTERVAL 以便进行算术运算。您可以添加 DATETIME 和 INTERVAL;结果是一个日期时间。您可以减去两个 DATETIME 值;结果是一个间隔。您可以添加或减去两个 INTERVAL 值,结果是一个 INTERVAL。但仅此而已。因此,要获得从 DATETIME HOUR TO SECOND 的 INTERVAL,您需要减去 DATETIME(00:00:00) HOUR TO SECOND。

你可以用字符串参数调用这个修改后的函数,就像你现在所做的那样。

如果你不能忍受这样改变界面,那么:

CREATE PROCEDURE up_myproc(
    calndr_dt_str       DATETIME YEAR TO DAY,
    actvty_typ          CHAR(5),
    actvty_start_tm_str CHAR(15),
    actvty_end_tm_str   CHAR(15),  
    actvty_cap          SMALLINT)

    DEFINE calndr_dt       DATETIME YEAR TO DAY;
    DEFINE actvty_start_tm INTERVAL HOUR TO SECOND;
    DEFINE actvty_end_tm   INTERVAL HOUR TO SECOND;  

    DEFINE tm_1 DATETIME YEAR TO SECOND;
    DEFINE tm_2 DATETIME YEAR TO SECOND;

    LET actvty_dt       = actvty_dt_str
    LET actvty_start_tm = actvty_start_tm_str;
    LET actvty_end_tm   = actvty_end_tm_str;
    LET tm_1            = EXTEND(clndr_dt, YEAR TO SECOND) + actvty_start_tm;
    LET tm_2            = EXTEND(clndr_dt, YEAR TO SECOND) + actvty_end_tm;

    ...

这仍然依赖于转换,但将它们隐藏在过程主体中并使它们显式。

未经测试的代码;我可能忽略了一些东西。

于 2012-08-28T16:11:08.857 回答