我正在尝试对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方法,我得到上述错误?
答案 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将在具有(例如)法语区域设置的服务器上失败。