2012-08-27 55 views
1

我想從c#調用下面的informix sp,但無法編譯它。我想給它傳遞一個像'2012-11-22'這樣的字符串和兩次像'08:15:00'並將它們轉換爲日期和兩個日期時間,但我似乎無法找到正確的informix函數。我花了整整一天的時間來解決這個問題,任何幫助都很有意義。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

我想辦法,這是使用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; 

    ... 

這仍然依賴於轉換,卻隱藏着他們在過程主體,使他們明確。

代碼未經測試;可能有一些我忽略了。

相關問題