2015-07-02 20 views
0

我在oracle中設置了一個存儲過程。它接受許多參數。其中有幾個是「日期」類型。通過Oracle中的參數插入日期

在我的應用程序檢查值,如果符合一定的標準,這樣的分配默認值:

private static string FixInputString(string s) 
{ 
    return string.IsNullOrEmpty(s) ? "-1" : s; 
} 

然後,我格式化爲日期爲Oracle

private static string ConvertToOracleDate(string s) 
{ 
    var temp = string.IsNullOrEmpty(s) || string.Equals(s, "-1", StringComparison.InvariantCultureIgnoreCase) 
     ? "01-Jan-1900" : Convert.ToDateTime(s).ToString("dd-MMM-yyyy"); 
    return temp; 
} 

當我運行它,我有這個值的變量:

enter image description here

然後我設置參數爲這樣:

new SpParameterOracle 
{ 
    Key = "p_SGND_DT", 
    Value = ConvertToOracleDate(FixInputString(form.SignedOnDate)), 
    Direction = ParameterDirection.Input, 
    Type = OracleDbType.Date 
}, 

這裏是參數的內容,因爲它是當我將其分配給的OracleCommand: enter image description here

我的存儲過程,處理輸入參數作爲這樣:

decode(TO_CHAR(p_SGND_DT, 'mm/dd/yyyy'), '01/01/1900', null, TO_DATE(p_SGND_DT, 'DD-MON-YYYY')), 

我也試過這樣:

decode(TO_CHAR(p_SGND_DT, 'mm/dd/yyyy'), '01/01/1900', null, p_SGND_DT), 

在表中的結果值是這樣的:

enter image description here

爲什麼它改變從01-JAN-1901到01-JAN-2001 ???

到目前爲止,我已經嘗試在應用程序和存儲過程中切換格式,結果仍然相同。

任何想法,將不勝感激。


正如其中一個答案所示,轉換是這個問題的罪魁禍首。

而不是處理它,我修改了存儲過程的邏輯以及代碼。 在存儲過程中我進行所有必要的字段可選這樣的:

p_SGND_DT in date default null, 

然後我簡單地插入一個值到表中。 在應用程序方面,我修改了代碼以僅發送使用的參數,省略了其餘的參數,這些參數爲空。

感謝您的幫助,並指引我朝着正確的方向前進。非常感激。

+0

你只是試圖從sqlplus中調用存儲過程和看到的結果是什麼? – OldProgrammer

+0

不,但我現在要做... –

+0

格式不好:'dd-MON-yyyy'。更改爲「dd/MM/yyyy」。結果相同:'1/1/2001'。 –

回答

2

問題出在您的存儲過程中的TO_DATE(p_SGND_DT, 'DD-MON-YYYY')p_sgnd_dt是DATE數據類型(或者你有暗含的意思),因此沒有必要嘗試再次將其轉換爲日期。

您應該只對某個字符串使用to_date。

如果你的東西,已經是一個日期做TO_DATE(),什麼情況是,甲骨文再次把它放回日期前做日期的隱式轉換回字符串。因此,你的TO_DATE(p_SGND_DT, 'DD-MON-YYYY')實際上變成:

TO_DATE(TO_CHAR(p_SGND_DT, <nls_date_format parameter>), 'DD-MON-YYYY')

默認NLS_DATE_FORMAT是「DD-MON-YY」,也就是說,您現在已經失去了今年前兩個數字,當Oracle嘗試將其轉換回一個四位數的年份,它猜測前兩位數字會是什麼 - 並使他們錯誤。

我不知道爲什麼你的參數轉換成字符串做擺在首位的比較,雖然 - 這將是更好的:

decode(p_SGND_DT, to_date('01/01/1900', 'dd/mm/yyyy'), null, p_SGND_DT)

,或者如果你是試圖消除之日起,在通過任何時間因素:

decode(p_SGND_DT, to_date('01/01/1900', 'dd/mm/yyyy'), null, trunc(p_SGND_DT))

+0

同意。但即使我放棄第二個'to_date'仍然是一樣的。 1/1/2001 –

+0

您能提供您的程序規格嗎? IE瀏覽器。該位告訴你關於預期參數的信息等。 – Boneist

+0

我不確定你的意思?你想看看整個過程嗎? –