5

我正在尝试针对 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 数据应用程序块中的 db.ExecuteNonQuery 方法,我得到了上述错误?

4

4 回答 4

12

要使日期格式 '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),但这两者都受用户语言环境的奇思妙想。

于 2009-10-13T22:03:32.710 回答
1

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

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

于 2009-10-13T15:35:53.807 回答
1

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

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

于 2009-10-13T16:04:43.187 回答
1

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

于 2009-10-13T16:15:18.640 回答