AS400 Emulator无法处理小于1940或大于2039的日期



我有一个简单的SQL脚本:

SELECT DATE(SUBSTR( '19310205' , 1 , 4) 
|| '-' || SUBSTR ('19310205' , 5 , 2) 
|| '-' || SUBSTR('19310205', 7 , 2)) 
FROM MY_TABLE;

每当我在iSeries导航器上运行脚本时,我都会得到预期的输出,即

1931-02-05

但是,当我使用strsql命令在AS400 Emulator上运行它时,我会得到以下输出:

++

我不知道为什么会发生这种情况;我所知道的是,只有1940-2039年间的日期运行良好。有人能解释一下原因吗?

此外,有没有其他日期也能成功处理的方法?

  • 在AS/400模拟器会话中,按"F13=服务"。

  • 选择"1。更改会话属性">

  • 将"日期格式"更改为"*ISO"或支持完整日期范围的所需格式。

来自IBM知识中心,"Rational Developer for i7.1.0":

日期是一个由三部分组成的值(年、月和日),用于指定格里高利日历20下的时间点,该日期被认为从公元1年开始生效。年份部分的范围为0001到9999。日期格式>*JUL、*MDY、*DMY和*YMD只能表示1940年至2039年之间的日期。月份部分的范围是1到12。日期部分的范围是1到>x,其中x是28、29、30或31,具体取决于月份和年份。

我只想建立在Richard Evans的答案上,但由于评论中有太多内容,我将把它作为一个新的答案。

IBMi有一个本机日期类型,可以存储从0001年1月1日到9999年12月31日的日期。日期类型的格式指定了日期的年份部分的位数。有两个主要分组会影响可接受的日期范围。两位数的年份格式,可以接受1940年1月1日至2039年12月31日的日期。它们是:*MDY*DMY*YMD*JUL。四位数的年份格式可以处理日期类型支持的所有日期。它们是*ISO*USA*EUR*JIS

除了支持所有支持日期格式的主要格式外,RPG还支持其他一些日期格式:*JOBRUN、三位数年份格式和*LONGJUL*JOBRUN是两位数的年份格式,只能为具有两位数年份的数字和字符日期字段指定。这将使用作业日期格式和分隔符值。三位数的年份格式可以处理1900年1月1日至2899年12月31日的日期。这些是*CMDY*CDMY*CYMD。三位数年份格式的C表示日期年份部分的两个最高有效数字,其中:

0 => 1900 - 1999
1 => 2000 - 2099
2 => 2100 - 2199
...
9 => 2800 - 2899

最后,*LONGJUL是一个四位数的年份儒略格式。

内部日期以*ISO格式存储。其他格式是外部格式。事实上,当使用SQL定义表时,您甚至不需要指定日期格式,它只是默认为*ISO。在可以指定格式的地方,它只是您正在指定的外部格式。最好对所有工作字段和数据库文件使用*ISO,即使使用DDS也是如此。然后为面向用户的字段保留其他外部格式,如*MDY*DMY,以将*ISO格式转换为更本地化的格式。通过这种方式,您可以存储用户可以输入或查看的全部日期范围。

使用varchar_format()函数以任何格式返回日期的字符表示。无论会话默认值或从何处运行。

SELECT                               
cast(                                
varchar_format(                      
cast(                                
DATE(SUBSTR( '19310205' , 1 , 4)     
|| '-' || SUBSTR ('19310205', 5 , 2) 
|| '-' || SUBSTR('19310205', 7 ,2))  
as timestamp )                      
, 'YYYY-MM-DD')                      
as char(10)) as mydate               
FROM sysibm/sysdummy1               

MYDATE
1931-02-05
********数据结束********

相关内容

  • 没有找到相关文章

最新更新