如何将十进制字段强制转换为DB2 AS / 400中的日期字段?

时间:2010-06-14 16:06:27

标签: sql db2 ibm-midrange

我有一个DECIMAL字段,其中包含AS400格式的日期:1100614

我试过了:

cast (MYDATE as DATE)

但是我无法将DECIMAL强制转换为DATE,而

DATE(MYDATE)

返回null。

如何在DATE字段中投射此字段?

5 个答案:

答案 0 :(得分:1)

假设它是我在上面的评论中提到的CYYMMDD,这里有几个选项:

  1. Convert CYYMMDD format to datetime - SQL
  2. convert cyymmdd (AS400) format to datetime format
  3. 可以做到,但这并不容易。如果你需要经常这样做,可能值得你花时间编写自己的函数来做这件事。

答案 1 :(得分:0)

在我参加的最近的DB2 for IBM i课程中,IBM人员建议使用预先填充的转换表,其中包含您需要支持的所有不同格式的日期值。您每年只需要365或366行。然后,您加入此表进行转换。当然,您需要为每种格式创建索引才能获得良好的性能。一个人表示,执行连接甚至比调用转换函数更快。

另一个优点是您可以在转换表中添加其他列,例如会计期间,季度,营业日指标等,这可以简化大量查询,例如在第三季度查找所有订单。< / p>

例如,假设DATECONV表有DATEFMT列作为实际日期而CYMDFMT作为小数日期,您的选择将是 选择DATEFMT,...... 来自CYTDFMT = MYDATE的MYTABLE JOIN DATECONV

此解决方案的一个问题是,如果您使用无效日期作为特殊值(例如9999999),因为您在实际日期字段中无法使用无效日期。但无论如何你无法转换它们。

答案 2 :(得分:0)

如果您使用的是IBM i 6.1或更高版本,这将有效,但我确实有一个旧版本的操作系统。我偷了this forum post的添加技巧。

create table dec1 (f1 decimal(7,0))
insert into dec1 values 1100614

select date(timestamp_format(char(f1+19000000), 'YYYYMMDD')) from dec1

结果:

DATE                           
06/14/10                       
********  End of data  ********

Here's the reference到DB2 for i SQL中支持的日期字符串格式。

答案 3 :(得分:0)

更简单(如果你想要自己的功能更合适)的方法是

SELECT CAST(CAST(*DecimalDateFromDB2_Here* + 19000000 AS VARCHAR) AS DATETIME)

实施例

- 显示2000 +日期

SELECT CAST(CAST(1040526 + 19000000 AS VARCHAR) AS DATETIME)

- 显示1999年+日期

SELECT CAST(CAST(990526 + 19000000 AS VARCHAR) AS DATETIME)

答案 4 :(得分:0)

[而且简单]表达式已经过验证,其功能可以追溯到v5r3,并且MYDATE列可以定义为CHAR(7),DEC(7),NUMERIC(任何一个) 7),INTEGER或FLOAT数据类型[或这些类型的更大长度/精​​度变体]如下;此示例中显示的DATE强制转换标量是转换字符串表达式[每个CONCAT]的结果,该表达式产生一个14个字符的字符串,该字符串将作为TIMESTAMP有效,格式为'YYYYMMDDHHMMSS'

DATE( DEC( 19000000 + MYDATE, 8, 0 ) CONCAT '000000' )

注意:上面的表达式可能[在别处看到]使用DIGITS投射标量写入DECIMAL投射结果,但是如果添加一个具有完整8位精度的值,那么这将是多余的,并且 DEC()表达式从数字到字符的隐式转换;在处理1000年之前的日期时需要DIGITS以确保字符串结果中的前导零,或者在某些甚至较旧的版本中,其中没有隐式强制转换从数字到字符的能力。

IBM i 7.2->Database->Reference->SQL reference->Language elements->Data types->Datetime values->String representations of datetime values->Timestamp strings