Informix,过程,将字符串转换为时间

时间:2012-08-27 22:11:04

标签: date stored-procedures time informix

我想从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;

1 个答案:

答案 0 :(得分: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;

    ...

这里的关键决定是将时间视为间隔时间,而不是将时间视为一小时。如果你有一个正式的DATETIME HOUR TO MINUTE参数,你需要转换为INTERVAL才能进行算术运算。您可以添加DATETIME和INTERVAL;结果是DATETIME。您可以减去两个DATETIME值;结果是一个INTERVAL。您可以添加或减去两个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;

    ...

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

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