2009-10-13 22 views
2

我試圖運行對Informix的以下數據庫命令:我收到「日期無效的月份」試圖運行這個?

delete from table1 
    where u_id in (select u_id 
        from table2 
        where c_id in (select c_id 
            from ptable 
            where name = 'Smith' 
             and dob = '29-08-1946')); 

我通過這個作爲一個字符串的MS數據應用程序塊的db.ExecuteNonQuery方法,我也得到了上述錯誤?

+0

我試過在'29/08/1946':: DATE中傳遞日期,我仍然在日期錯誤中獲取無效的月份? – Bernard 2009-10-14 10:13:25

回答

5

要使日期格式'29 -08-1946'正常工作,您需要將DBDATE環境變量設置爲諸如「DMY4-」(或「DMY4 /」)之類的值。這些是英國的標準版本(我使用它們多年;我現在只使用「Y4MD-」,除了在調試其他人的環境時,它們都符合ISO 8601:2004(日期格式)和ISO 9075(SQL))。還有其他環境變量可以影響日期格式 - 事實上它們中有很多 - 但DBDATE優先於其他格式,所以它是修復問題的大錘。

其中一個問題是,在美國和英國(和ISO)的DBDATE設置之間,使用純字符串的符號不可移植。如果你有一個選擇,對於日期的中性構造是MDY()函數:

WHERE dob = MDY(8,29,1946) 

這工作DBDATE的設置無關。你也許可以使用TO_DATE()太:

SELECT TO_DATE('29-08-1946', '%d-%m-%Y') FROM dual; 

這產生了我 '1946年8月29日00:00 00.00000' - 函數生成DATETIME YEAR TO分數(5)值,但這些轉換可靠到Informix的DATE值。您也可以使用DATE()函數或顯式轉換爲DATE(CAST('29-08-1946'AS DATE)或'29 -08-1946'DATE),但這兩個受到用戶語言環境的突發事件的影響。

+0

MDY()不能工作:( – Bernard 2009-10-14 10:46:16

+0

道歉 - 它的確!謝謝! – Bernard 2009-10-14 10:47:55

1

您的日期字段格式不正確。由於1946年的第29個月沒有導致錯誤的原因。

我想嘗試交換月份和日期。 1946年8月29日。

1

讀取日期字符串的日期和月份部分的方式可能取決於計算機的文化設置。

它始終是比較安全的日期字符串傳遞到形式數據庫「DD-MMM-YYYY」(即1929年-aug 1946' )

+1

或者設置你的連接和代碼來使用ODBC格式{d'1990-10-02'}。請參閱http://msdn.microsoft.com/en-us/library/ms190234(SQL.90).aspx。 – DaveE 2009-10-13 16:22:23

1

它通過他們爲YYYY-MM-是更安全DD,則該例中的dd-MMM-yyyy將在具有(例如)法語區域設置的服務器上失敗。

相關問題