从SQL Server到Informix链接服务器的日期值

时间:2013-06-27 18:40:20

标签: sql-server informix

我在SQL Server 2008R2(10.5)中使用Microsoft OLE DB Provider for ODBC Drivers(实际上指向使用ODBC驱动程序的DSN)连接到Informix(Atomix)数据库的链接服务器设置。通过这个,我可以插入记录,只要我插入的记录不会尝试插入日期值。我在日期值周围使用的分隔符和我尝试的SQL语法无关紧要 - 参见示例:

INSERT INTO  [linkedinformix]...[tablename](daterequested) VALUES (2013-06-27) 

SELECT * FROM OPENQUERY(linkedinformix,'INSERT INTO tablename (daterequested) 
VALUES (2013-06-21))

以上将给出语法错误或类型冲突错误(或者在其他情况下,如果我不运行提供程序,将导致SQL Server崩溃)。我尝试在我传递的日期值周围使用{},#,|和其他分隔符,并尝试了不同的日期格式(2013年6月27日等)。

如果我在同一个DSN上指向Microsoft Access来创建链接表,我可以手动向表中写日期,所以我知道ODBC驱动程序可以处理它。

必须有一个简单的答案......

2 个答案:

答案 0 :(得分:1)

Informix和DATE类型 - 一个有趣(复杂)的主题。实际上,它在Informix世界中相当简单;当其他系统参与到如何处理事情的不同观点时,就会变得棘手。

如果设置正确(例如在我的环境中),您可以在Informix世界中写一下:

INSERT INTO tablename(daterequested) VALUES('2013-07-03');

你可以用双引号替换单引号,因为Informix对差异不严,除非你握住它并且说“我想在使用双引号时大声喊叫”。

更精细的是,你也可以写:

INSERT INTO tablename(daterequested) VALUES(DATETIME(2013-07-03) YEAR TO DAY);

这将起作用,因为(a)DATETIME的格式在ISO 8601(日期/时间格式)或ISO 9075(SQL)格式中得到修复,并且(b)Informix将从DATETIME YEAR转换为DATE到DATE没有任何疑虑。这是可靠的,并不依赖于任何环境变量设置或其他复杂功能,与第一个版本不同。

您还可以可靠地写:

INSERT INTO tablename(daterequested) VALUES(MDY(7, 3, 2013));

这使用函数MDY将三个整数转换为DATE;参数的顺序是(助记)月,日,年。这是可靠的,因为它不依赖于环境变量。

第一种表示法(使用字符串'2013-07-03')依赖于环境变量。经典变量是$DBDATE;我在环境中设置了DBDATE=y4md-,因此像'2013-07-03'这样的字符串在ISO 9075中被解释。但是,对于美式日期,DBDATE的默认值实际上是DBDATE=mdy4/。但是,还有其他变量,例如CLIENT_LOCALE,DB_LOCALE和GL_DATE都希望进入游戏。我使用DBDATE是因为它具有最高优先级(并且从一开始就已经完成),但是较新的(其他)变量有其优点。您还可以尝试:

INSERT INTO tablename(daterequested) VALUES(DATE('07/03/2013'))

注意引号和括号。字符串根据环境变量进行解释。不要尝试DATE(2013-07-03),因为这相当于DATE(2003)(2013年减7是2006; 2006年 - 3是2003),因为第1天是1900-01-01,2003年是1905-06 -16,星期一。

SQL标准提供DATE '2013-03-07',但Informix不支持无括号的表示法。

您需要将SQL Server符号重新添加到SQL语法中,但MDY和DATETIME方法将起作用,如果您愿意使用环境变量或修改,您可以将DATE方法用于工作日期字符串的格式以匹配预期的行为。

答案 1 :(得分:0)

根据以下答案尝试格式Mmm-DD-YY:

Linked Informix table in MS SQL Server ignoring criteria

请注意,它区分大小写。