tlu*_*lum 0 oledb date reporting-services ibm-midrange
使用 IBMDA400 OleDb 提供程序对 AS400 运行 SELECT 似乎将日期作为字符串值返回,当您尝试将日期格式应用于字段时,SSRS 只是嘲笑您。我在 SELECT 中尝试了一个简单的 CAST 无济于事。
如何从 iSeries OleDb 提供程序获取实际的 DBTYPE_DBDATE 结构?
我应该提到,有问题的日期都是由 DATE 类型的 UDF 返回的。IBM 似乎将 DATE 类型映射到 DBTYPE_STR OleDb 类型。
表中的字段可能未定义为日期类型。您将需要使用该DATE函数作为查询的一部分来转换它们。
您可以使用DSPFFD命令Navigator或查询SYSIBM.SQLCOLUMNS表来查看字段定义。
在对 IBMDA400 提供程序进行进一步测试后,我发现Convert Date Time To Char属性隐藏在作为 Programmer's Toolkit with Access 的一部分安装的 OLE DB 技术参考中。默认值为TRUE。在连接字符串或属性中设置Convert Date Time To 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
Run Code Online (Sandbox Code Playgroud)
有关可能的 ADO 数据类型,请参阅MSDN:DataTypeEnum。adDBDate 是 133。
将日期时间转换为字符
指定 DB2 for IBM i Date、Time 和 Timestamp 数据类型到相应 PC 数据类型的转换,反之亦然。
设置和返回值
设置或返回以下字符串值之一。默认值是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。
“错误的”
DB2 for IBM i Date、Time 和 Timestamp 数据类型将转换为 PC Date、Time 和 Timestamp 数据类型。在仅支持 Variant Date 数据类型(如 Visual Basic)的环境中使用此值时应小心。由于 Variant Date 数据类型的限制导致截断或溢出,您可能会遇到意外错误。
以下是将日期时间转换为字符时的其他注意事项。
评论
此自定义属性可用于 ADO 连接对象。该属性在连接关闭时为读/写,在连接打开时为只读。
德尔福示例
<connection>.Provider := 'IBMDA400';
<connection>.Properties('Convert Date Time To Char') := "TRUE";
Run Code Online (Sandbox Code Playgroud)
或者
<connection>.Open('Provider=IBMDA400;Data Source=SystemA;Convert Date Time To Char =TRUE', 'Userid', 'Password');
Run Code Online (Sandbox Code Playgroud)
PowerBuilder 示例
<connection>.Provider = "IBMDA400"
SetProperty(<connection>), "Convert Date Time To Char", "TRUE")
Run Code Online (Sandbox Code Playgroud)
或者
<connection>.Open("Provider=IBMDA400;Data Source=SystemA;Convert Date Time To Char=TRUE", "Userid", "Password")
Run Code Online (Sandbox Code Playgroud)
Visual Basic 示例
<connection>.Provider = "IBMDA400"
<connection>.Properties("Convert Date Time To Char") = "TRUE"
Run Code Online (Sandbox Code Playgroud)
和/或
<connection>.Open "Provider=IBMDA400;Data Source=SystemA;Convert Date Time To Char=TRUE", "Userid", "Password")
Run Code Online (Sandbox Code Playgroud)