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

Sql server 从SQL Server到Informix链接服务器的日期值,sql-server,informix,Sql Server,Informix,我在SQL server 2008R2(10.5)中有一个链接服务器设置,它使用Microsoft OLE DB Provider for ODBC驱动程序(它实际上指向使用ODBC驱动程序的DSN)连接到Informix(Atomix)数据库。通过这种方式,只要插入的记录不尝试插入日期值,就可以插入记录。我在日期值周围使用的分隔符和尝试使用的SQL语法都无关紧要——请参见示例: INSERT INTO [linkedinformix]...[tablename](daterequested)

我在SQL server 2008R2(10.5)中有一个链接服务器设置,它使用Microsoft OLE DB Provider for ODBC驱动程序(它实际上指向使用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崩溃)。我已经尝试在传递的日期值周围使用{}、#、|和其他分隔符,还尝试了不同的日期格式(06/27/2013等)

如果我将Microsoft Access指向同一DSN以创建链接表,我可以手动将日期写入该表,因此我知道ODBC驱动程序可以处理它


必须有一个简单的答案…

根据此答案尝试Mmm DD YY格式:


请注意,它区分大小写。

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


请注意,它是区分大小写的。

Informix和日期类型-一个有趣(复杂)的主题。实际上,在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年转换到日期。这是可靠的,与第一个版本不同,它不依赖于任何环境变量设置或其他复杂情况

您还可以可靠地编写:

INSERT INTO tablename(daterequested) VALUES(MDY(7, 3, 2013));
这使用函数MDY将三个整数转换为日期;参数的顺序是(记忆法上)月、日、年。这是可靠的,因为它不依赖于环境变量

第一个符号(使用字符串
'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'))
注意引号和括号。根据环境变量解释字符串。不要尝试日期(2013-07-03),因为这相当于日期(2003)(2013减去7是2006;2006-3是2003),因为第一天是1900-01-01,第2003天是1905-06-16,一个星期一

SQL标准提供了日期为“2013-03-07”的
DATE
,但Informix不支持无括号表示法


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

Informix和日期类型-很有趣(复杂的)主题。事实上,从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年转换为DATETIME日,没有任何疑虑。这是可靠的,并且与第一个版本不同,不依赖任何环境变量设置或其他复杂情况

您还可以可靠地编写:

INSERT INTO tablename(daterequested) VALUES(MDY(7, 3, 2013));
这使用函数MDY将三个整数转换为日期;参数的顺序是(助记符)月、日、年。这是可靠的,因为它不依赖于环境变量

第一个符号(使用字符串
'2013-07-03'
)依赖于环境变量。经典变量是
$DBDATE
;我在环境中设置了
DBDATE=y4md-
,因此像
'2013-07-03'
这样的字符串被解释为ISO 9075中的字符串。但是,对于美式日期,DBDATE的默认值实际上是
DBDATE=mdy4/
。不过,还有其他v变量,如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),因为第一天是1900-01-01,第2003天是1905-06-16,一个星期一

SQL标准规定了日期为'2013-03-07'bu