我有一个DECIMAL字段,其中包含AS400格式的日期:1100614
我试过了:
cast (MYDATE as DATE)
但是我无法将DECIMAL强制转换为DATE,而
DATE(MYDATE)
返回null。
如何在DATE字段中投射此字段?
答案 0 :(得分:1)
假设它是我在上面的评论中提到的CYYMMDD,这里有几个选项:
可以做到,但这并不容易。如果你需要经常这样做,可能值得你花时间编写自己的函数来做这件事。
答案 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以确保字符串结果中的前导零,或者在某些甚至较旧的版本中,其中没有隐式强制转换从数字到字符的能力。