2009-10-13 53 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将在具有(例如)法语区域设置的服务器上失败。