使用IBMDA400 OleDb提供程序对AS400运行SELECT似乎将日期作为字符串值返回,当您尝试将日期格式应用于字段时,SSRS会嘲笑您。我在SELECT中尝试过一个简单的CAST无济于事。
如何从iSeries OleDb提供程序返回实际的DBTYPE_DBDATE结构?
我应该提到有问题的日期都是由DATE类型的UDF返回的。 IBM似乎将DATE类型映射到DBTYPE_STR OleDb类型。
答案 0 :(得分:4)
表中的字段可能未定义为日期类型。您需要使用DATE
函数将其转换为查询的一部分。
您可以使用DSPFFD
命令,Navigator或查询 SYSIBM.SQLCOLUMNS 表来查看字段定义。
<小时/>
在使用IBMDA400提供程序进行进一步测试后,我发现在作为Programmer's Toolkit with Access安装的OLE DB技术参考中隐藏了转换日期时间为Char 属性。默认值为 TRUE 。在连接字符串或属性中将转换日期时间设置为Char = FALSE 以禁用此“功能”。
这是一个快速的VBA测试:
Set cn = CreateObject("ADODB.Connection")
cn.Open "Provider=IBMDA400;Data Source=...;User ID=...;Password=...;Convert Date Time To Char=FALSE"
Set rs = cn.Execute("SELECT DATE(NOW()) FROM SYSIBM.SYSDUMMY1")
MsgBox "Returned ADO type: " & rs.Fields(0).Type
有关可能的ADO数据类型,请参阅MSDN: DataTypeEnum。 adDBDate是133。
<小时/>
将日期时间转换为字符
指定将DB2 for IBM i Date,Time和Timestamp数据类型转换为相应的PC数据类型,反之亦然。
设置和返回值
设置或返回以下字符串值之一。默认值为“TRUE”。
<强> “TRUE”强>
DB2 for IBM i Date,Time和Timestamp数据类型被视为字符串。读取IBM i数据时,这些值将转换为字符串。将数据写入系统时,期望字符串作为这些值的输入。 Date数据类型支持的字符串格式为ISO格式:yyyy-mm-dd。 Time数据类型支持的字符串格式是ISO格式的早期版本:hh.mm.ss。 Timestamp数据类型支持的字符串格式为:yyyy-mm-dd-hh.mm.ss.nnnnnn。
<强> “FALSE”强>
DB2 for IBM i Date,Time和Timestamp数据类型将转换为PC Date,Time和Timestamp数据类型。在仅支持Variant Date数据类型(如Visual Basic)的环境中使用此值时应小心。由于Variant Date数据类型的限制导致截断或溢出,您可能会遇到意外错误。
当转换日期时间到字符为FALSE时,以下是其他注意事项。
<强>说明强>
此自定义属性在ADO连接对象上可用。连接关闭时读取/写入属性,连接打开时读取只读。
Delphi示例
<connection>.Provider := 'IBMDA400';
<connection>.Properties('Convert Date Time To Char') := "TRUE";
OR
<connection>.Open('Provider=IBMDA400;Data Source=SystemA;Convert Date Time To Char =TRUE', 'Userid', 'Password');
PowerBuilder示例
<connection>.Provider = "IBMDA400"
SetProperty(<connection>), "Convert Date Time To Char", "TRUE")
OR
<connection>.Open("Provider=IBMDA400;Data Source=SystemA;Convert Date Time To Char=TRUE", "Userid", "Password")
Visual Basic示例
<connection>.Provider = "IBMDA400"
<connection>.Properties("Convert Date Time To Char") = "TRUE"
和/或
<connection>.Open "Provider=IBMDA400;Data Source=SystemA;Convert Date Time To Char=TRUE", "Userid", "Password")
答案 1 :(得分:0)
看来正确的答案是,你不能。 IBMDA400提供程序没有办法将任何类型映射到DBTYPE_DBDATE。
您可以使用DateValue()SSRS函数将返回的DBTYPE_STR值转换为日期/时间序列。从那里格式化函数将起作用。
我在北美没有遇到问题,使用DateValue()函数直接解释返回的DBTYPE_STR值,但是,由于日期格式不同,这可能是其他语言环境中的一个问题。