使用 IBMDA400 OleDb 提供程序对 AS400 运行 SELECT 似乎将日期作为字符串值返回,当您尝试将日期格式应用于该字段时,SSRS 只会嘲笑您。我在 SELECT 中尝试了一个简单的 CAST 无济于事。
如何从 iSeries OleDb 提供程序中获取实际的 DBTYPE_DBDATE 结构?
我应该提到,有问题的日期都是由具有 DATE 类型的 UDF 返回的。IBM 似乎将 DATE 类型映射到 DBTYPE_STR OleDb 类型。
使用 IBMDA400 OleDb 提供程序对 AS400 运行 SELECT 似乎将日期作为字符串值返回,当您尝试将日期格式应用于该字段时,SSRS 只会嘲笑您。我在 SELECT 中尝试了一个简单的 CAST 无济于事。
如何从 iSeries OleDb 提供程序中获取实际的 DBTYPE_DBDATE 结构?
我应该提到,有问题的日期都是由具有 DATE 类型的 UDF 返回的。IBM 似乎将 DATE 类型映射到 DBTYPE_STR OleDb 类型。
表中的字段可能未定义为日期类型。您将需要使用该DATE
函数将它们转换为查询的一部分。
您可以使用NavigatorDSPFFD
命令或查询SYSIBM.SQLCOLUMNS表来查看字段定义。
在使用 IBMDA400 提供程序进行进一步测试后,我发现作为 Programmer's Toolkit with Access 的一部分安装的 OLE DB 技术参考中隐藏了Convert Date Time To Char属性。默认值为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
有关可能的 ADO 数据类型,请参阅MSDN:DataTypeEnum。addDBDate 是 133。
将日期时间转换为字符
指定将 DB2 for IBM i 日期、时间和时间戳数据类型转换为相应的 PC 数据类型,反之亦然。
设置和返回值
设置或返回以下字符串值之一。默认值是true”。
“真的”
DB2 for IBM i 日期、时间和时间戳数据类型被视为字符串。读取 IBM i 数据时,这些值将转换为字符串。将数据写入系统时,字符串应作为这些值的输入。Date 数据类型支持的字符串格式为 ISO 格式:yyyy-mm-dd。Time 数据类型支持的字符串格式是 ISO 格式的早期版本:hh.mm.ss。Timestamp 数据类型支持的字符串格式为:yyyy-mm-dd-hh.mm.ss.nnnnnn。
“错误的”
DB2 for IBM i 日期、时间和时间戳数据类型将转换为 PC 日期、时间和时间戳数据类型。在仅支持 Variant Date 数据类型(如 Visual Basic)的环境中使用此值时应小心。由于 Variant Date 数据类型的限制导致截断或溢出,您可能会遇到意外错误。
以下是 Convert Date Time To Char 为 FALSE 时的其他注意事项。
评论
此自定义属性在 ADO 连接对象上可用。该属性在连接关闭时为读/写,在连接打开时为只读。
德尔福示例
<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');
PowerBuilder 示例
<connection>.Provider = "IBMDA400"
SetProperty(<connection>), "Convert Date Time To Char", "TRUE")
或者
<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")
看来正确的答案是,你不能。IBMDA400 提供程序无法将任何类型映射到 DBTYPE_DBDATE。
您可以做的是使用 DateValue() SSRS 函数将返回的 DBTYPE_STR 值转换为日期/时间序列。从那里格式化功能将对其进行处理。
我没有遇到问题,在北美,DateValue() 函数直接解释返回的 DBTYPE_STR 值,但是,由于日期格式差异,这在其他语言环境中可能是一个问题。