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

Ber*_*ard 3 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'));
Run Code Online (Sandbox Code Playgroud)

我将此作为字符串传递给MS数据应用程序块中的db.ExecuteNonQuery方法,我得到上述错误?

Jon*_*ler 9

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

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

WHERE dob = MDY(8,29,1946)
Run Code Online (Sandbox Code Playgroud)

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

SELECT TO_DATE('29-08-1946', '%d-%m-%Y') FROM dual;
Run Code Online (Sandbox Code Playgroud)

这为我生成'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),但这两个都受制于用户区域设置的奇思妙想.