更改数据表(来自AS400)列格式

时间:2013-04-04 12:50:51

标签: .net oledb ibm-midrange

我遇到了这个问题:

我们的AS400以 yyyyMMdd 的格式将日期保留为十进制,但是 我需要在我们的软件中使用它们 DateTime ,格式为 ddMMyyy

我如何才能获得正确的格式和类型? 我查看了IBM网站,以便在连接时设置格式... 但似乎您需要在DateTime类型的列中使用您的日期才能开始 设置格式。

http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=%2Frzaik%2Frzaikconnstrkeywordsformatprop.htm

我还尝试克隆数据表并将相应的列设置为正确的数据类型但是我需要循环所有行和每个单元格以进行转换 在大型查询中无法做到。

有人可以帮帮我吗?

这是我用来更改执行查询的日期字段的代码:

' convert date for selects
        If type = Operation.SelectMultipleRows Or type = Operation.SelectSingleValue Then

            For Each s As String In _datefields
                sql = sql.Replace(s, "REPLACE(CHAR(DATE(SUBSTR(CHAR(" & s & "), 1, 4) ||'-'|| SUBSTR(CHAR(" & s & "), 5, 2) ||'-'|| SUBSTR(CHAR(" & s & "), 7, 2)),EUR),'.','/') as " & s)
            Next

        End If

以上仅适用于在select查询中提供请求字段的情况。如果你使用*那么它根本不起作用。

在iSeries AS400中,如果您知道表名,则可以获取所有列名的列表,但我不能依赖它,因为传递的查询可能包含连接,....

示例:

SELECT COLUMN_NAME FROM QSYS2/COLUMNS WHERE TABLE_NAME = 'MYTABLE'  

3 个答案:

答案 0 :(得分:3)

在字段选择中请求重新格式化的日期:

date(substr(datefield,1,4) || '-' || substr(datefield,5,2)|| '-' || substr(datefield,7,2)) as datefield

答案 1 :(得分:3)

DB2 for IBM i上有一个实际的日期数据类型。有一些较旧的数据库仍然使用十进制数而不是日期数据类型,这就是你所拥有的情况。

如果IBM管理员允许您将软件加载到i上,请尝试使用Alan Campin的iDate service program。它将为您提供一组用户定义的函数,这些函数将执行十进制到日期的转换,以便您可以使用相当简单的SQL语句来操作这些数字数据类型。

如果您无法将软件加载到IBM端,那么您将被迫通过一些丑陋的变体自行完成转换:

date(
     substr(char(numericDate),1,4) concat 
     '-' concat 
     substr (char(numericDate),5,2) concat 
     '-' concat 
     substr(char(numericDate),7,2)
  )

这种扭曲是必需的,因为DATE()函数需要ISO格式的字符字段。

答案 2 :(得分:1)

如果您无法下载或使用@ Buck的答案中提到的SQL函数,或者,我建议您(或某人)在数据库中创建SQL用户定义函数。

使其成为DETERMINISTIC函数,这意味着只要函数的输入相同,结果就会相同。这允许DB2缓存结果,这将为您提供更好的性能,因为它不必在每次再次看到相同值时重复计算。

也许就是这样:

CREATE FUNCTION YMD2DATE (ymd dec(8,0) )
                        returns  date
       SPECIFIC YMD2DATE_dec8
       LANGUAGE SQL
       CONTAINS SQL
       DETERMINISTIC
       NO EXTERNAL ACTION
       RETURNS NULL ON NULL INPUT
       NOT FENCED
       SET OPTION DBGVIEW = *SOURCE
prc:       BEGIN NOT ATOMIC  -- not atomic means dont rollback on error
             DECLARE ans    date    default '0001-01-01';
             SET     ans = date( insert(insert( trim(digits(ymd)) ,7,1,'-'),5,1,'-'))  );
             RETURN  ans;
           END prc
;