繁体   English   中英

在SSRS报表中使用AS400日期

[英]Using AS400 date in SSRS Report

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

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

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

表中的字段可能未定义为日期类型。 您将需要使用DATE函数将它们转换为查询的一部分。

您可以使用DSPFFD命令, 导航器 ,或查询SYSIBM.SQLCOLUMNS表以查看字段定义。


UPDATE

在与IBMDA400提供程序进行进一步测试之后,我发现“ OLE DB技术参考”中隐藏了“ 将日期转换为字符”属性,这是作为带有Access的程序员工具包的一部分而安装的。 默认值为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提供程序功能>特殊属性

将日期时间转换为字符

指定将IBM i Date,Time和Timestamp数据类型的DB2转换为相应的PC数据类型,反之亦然。

设置和返回值

设置或返回以下字符串值之一。 默认值是true”。

“真正”

DB2 for IBM i日期,时间和时间戳记数据类型被视为字符串。 读取IBM i数据时,这些值将转换为字符串。 将数据写入系统时,字符串应作为这些值的输入。 Date数据类型支持的字符串格式为ISO格式:yyyy-mm-dd。 时间数据类型支持的字符串格式是ISO格式的早期版本:hh.mm.ss。 Timestamp数据类型支持的字符串格式为:yyyy-mm-dd-hh.mm.ss.nnnnnn。

“假”

DB2 for IBM i日期,时间和时间戳数据类型将转换为PC日期,时间和时间戳数据类型。 在仅支持Variant Date数据类型的环境(如Visual Basic)中使用此值时应小心。 由于变量日期数据类型的限制而导致的截断或溢出,可能会遇到意外的错误。

将日期时间转换为字符为假时,以下是其他注意事项。

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

备注

该自定义属性在ADO连接对象上可用。 当连接关闭时该属性为读/写,而在连接打开时该属性为只读。

Delphi示例

<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"

AND / OR

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM