在SSRS报告中使用AS400日期

时间:2013-07-30 15:56:00

标签: date reporting-services oledb ibm-midrange

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

如何从iSeries OleDb提供程序返回实际的DBTYPE_DBDATE结构?

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

2 个答案:

答案 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。

<小时/>

IBM i Access for Windows OLE DB技术参考

IBM i OLE DB提供程序函数&gt;特殊属性

将日期时间转换为字符

指定将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时,以下是其他注意事项。

  • 变量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连接对象上可用。连接关闭时读取/写入属性,连接打开时读取只读。

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值,但是,由于日期格式不同,这可能是其他语言环境中的一个问题。