试图运行这个“我在日期无效的月份”?

时间:2009-10-13 15:20:04

标签: informix

我正在尝试对Informix运行以下db命令:

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 Data Application块中的db.ExecuteNonQuery方法,我得到上述错误?

4 个答案:

答案 0 :(得分:8)

要使日期格式'29 -08-1946'生效,您需要将DBDATE环境变量设置为诸如“DMY4-”(或“DMY4 /”)之类的值。这些是英国的标准版本(我使用它们多年;我现在只使用“Y4MD-”,它与ISO 8601:2004(日期格式)和ISO 9075(SQL)相匹配,除非在调试其他人的环境时)。还有其他环境变量可以影响日期格式化 - 实际上相当多的是 - 但DBDATE优先于其他环境变量,所以它是解决问题的大锤子。

其中一个问题是使用普通字符串的表示法在DBDATE的美国和英国(和ISO)设置之间无法移植。如果您有选择,则日期的中性构造函数是MDY()函数:

WHERE dob = MDY(8,29,1946)

无论DBDATE的设置如何,这都有效。您也可以使用TO_DATE():

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

这为我生成'1946-08-29 00:00:00.00000' - 该函数生成DATETIME YEAR TO FRACTION(5)值,但那些可靠地转换为Informix中的DATE值。

你也可以使用DATE()函数或DATE显式转换(CAST('29 -08-1946'AS DATE)或'29 -08-1946':: DATE),但这两个都是受用户区域设置的影响。

答案 1 :(得分:1)

您的日期字段格式不正确。由于1946年没有第29个月导致错误。

我会尝试交换月和日。 1946年8月29日

答案 2 :(得分:1)

读入日期字符串的日期和月份部分的方式取决于计算机的文化设置。

以'dd-MMM-yyyy'形式将日期字符串传递给数据库总是更安全(即'29 -aug-1946')

答案 3 :(得分:1)

将它们作为YYYY-MM-DD传递更安全,该示例中的dd-MMM-yyyy将在具有(例如)法语区域设置的服务器上失败。