0

使用 IBMDA400 OleDb 提供程序对 AS400 运行 SELECT 似乎将日期作为字符串值返回,当您尝试将日期格式应用于该字段时,SSRS 只会嘲笑您。我在 SELECT 中尝试了一个简单的 CAST 无济于事。

如何从 iSeries OleDb 提供程序中获取实际的 DBTYPE_DBDATE 结构?

我应该提到,有问题的日期都是由具有 DATE 类型的 UDF 返回的。IBM 似乎将 DATE 类型映射到 DBTYPE_STR OleDb 类型。

4

2 回答 2

5

表中的字段可能未定义为日期类型。您将需要使用该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。


IBM i Access for Windows OLE DB 技术参考

IBM i OLE DB 提供程序函数 > 特殊属性

将日期时间转换为字符

指定将 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 时的其他注意事项。

  • 变体 Date 数据类型实际上是时间戳,不支持微秒 - DB2 for IBM i 时间戳的精度。OLE DB 提供程序将截断小数时间戳而不报告错误。例如,1990-03-02-08.30.00.100517 将变为 1990-03-02-08.30.00.000000。所有更新或插入的时间戳值都将具有 0 微秒。
  • 闰秒溢出错误。OLE DB 时间戳允许最多两个闰秒(值 60 或 61)。DB2 for IBM i 支持最大值 59。如果设置了闰秒,则会返回溢出错误。
  • 变体日期数据类型不支持 ISO 日期或时间戳的数据限制。在许多数据库(包括 DB2 for IBM i)中用作默认日期的值“0001-01-01”将导致溢出。
  • DB2 for IBM i 支持 TIME 数据类型的某些旧格式的时间值 24:00:00。OLE DB 提供程序会将 24:00:00 的值转换为 00:00:00,而不会出现任何错误消息或警告。
  • 通常对于 VB 变体,日期值 1899-12-30(即 0 日期)用于暗示仅时间变体日期。午夜 (00:00:00) 的时间用于暗示仅日期变体日期。

评论

此自定义属性在 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")
于 2013-07-30T16:33:53.457 回答
0

看来正确的答案是,你不能。IBMDA400 提供程序无法将任何类型映射到 DBTYPE_DBDATE。

您可以做的是使用 DateValue() SSRS 函数将返回的 DBTYPE_STR 值转换为日期/时间序列。从那里格式化功能将对其进行处理。

我没有遇到问题,在北美,DateValue() 函数直接解释返回的 DBTYPE_STR 值,但是,由于日期格式差异,这在其他语言环境中可能是一个问题。

于 2013-07-30T17:34:28.787 回答