我正在尝试对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方法,我得到上述错误?
要使日期格式'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),但这两个都受制于用户区域设置的奇思妙想.