1

我有这个问题:

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

我怎样才能最好地获得正确的格式和类型?我查看了 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

只有在选择查询中给出了请求的字段时,上述方法才有效。如果您使用 * 那么它根本不起作用。

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

例子:

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

3 回答 3

3

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

date(substr(datefield,1,4) || '-' || substr(datefield,5,2)|| '-' || substr(datefield,7,2)) as datefield
于 2013-04-04T13:15:23.377 回答
3

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

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

如果您无法将软件加载到 IBM 端,您将被迫通过以下一些丑陋的变体自己进行转换:

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

因为 DATE() 函数需要 ISO 格式的字符字段,所以需要这种变形。

于 2013-04-04T13:21:12.827 回答
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
;
于 2013-04-04T22:09:15.430 回答