AS400仿真器不能处理日期小于1940或大于2039

时间:2017-11-06 05:07:51

标签: sql date ibm-midrange iseries-navigator

我有这个简单的SQL脚本:

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

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

  

1931-02-05

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

  

++++++++

我不知道为什么会这样;我所知道的是,只有1940年至2039年之间的日期运作良好。有谁能解释为什么?

此外,还有其他日期可以成功处理的方法吗?

3 个答案:

答案 0 :(得分:4)

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

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

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

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

  

日期是指定格里高利历20下的时间点>的三部分值(年,月和日),假设已经从>公元1年开始生效。年份部分是0001到9999.日期格式> * JUL,* MDY,* DMY和* YMD只能表示1940到&n; 2039范围内的日期。月份部分的范围是1到12.日期部分的范围是1到> x,其中x是28,29,30或31,具体取决于月份和年份。

答案 1 :(得分:2)

我只想在理查德·埃文斯的回答基础上继续发展,但由于评论太多,我会把它作为一个新答案。

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

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

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

最后*LONGJUL是四位数的Julian格式。

内部日期以*ISO格式存储。其他格式是外部格式。事实上,在使用SQL定义表时,您甚至无法指定日期格式,它只是默认为* ISO。在您可以指定格式的位置,它只是您指定的外部格式。即使使用DDS,最好对所有工作字段和数据库文件使用*ISO。然后为面向用户的字段保留其他外部格式,例如*MDY*DMY,以将*ISO格式转换为更本地化的格式。这样,您可以存储用户可以输入或查看的所有日期。

答案 2 :(得分:0)

使用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年2月5日
********数据结束********