Ibm midrange AS400 YYYYMMDD-1个月

Ibm midrange AS400 YYYYMMDD-1个月,ibm-midrange,Ibm Midrange,我们从运行i5 AS/400数据库的合作伙伴处获取数据。 它们的日期列都是YYYYMMDD格式。在我的查询中,我只想得到上个月添加的内容 我知道我可以得到当前的_日期并减去1个月,但它是日期格式的。 因此,我的选择是要么获取YYYYMMDD并将其转换为日期格式,要么获取当前日期并将其更改为YYYYMMDD格式 由于AS/400缺少tsql的convert命令,我不确定哪种方法是最好的。您最好的选择是将您要查找的日期输入YYYYMMDD格式。这样,您就可以让数据库根据查询规范来比较数据。我想您是说

我们从运行i5 AS/400数据库的合作伙伴处获取数据。
它们的日期列都是YYYYMMDD格式。在我的查询中,我只想得到上个月添加的内容

我知道我可以得到当前的_日期并减去1个月,但它是日期格式的。
因此,我的选择是要么获取YYYYMMDD并将其转换为日期格式,要么获取当前日期并将其更改为YYYYMMDD格式


由于AS/400缺少tsql的convert命令,我不确定哪种方法是最好的。

您最好的选择是将您要查找的日期输入YYYYMMDD格式。这样,您就可以让数据库根据查询规范来比较数据。

我想您是说日期列实际上是八位数字字段,碰巧包含我们解释为日期的值。我还假设您直接针对i5数据库运行这些查询

您需要将日期转换为YYYYMMDD数值,然后查询YYYYMMDD字段。将数据库中的YYYYMMDD值转换为日期并与之进行比较将需要转换每个值,这将消除在该列上使用索引的可能性。由于YYYYMMDD字段中的日期无效,您可能会遇到问题

下面是一个将日期计算转换为八位数字(YYYYMMDD)的示例:

select year(current_date - 1 month) * 10000 +
       month(current_date - 1 month) * 100 + 
       day(current_date - 1 month)           
from sysibm.sysdummy1                        
您可以在如下查询中使用:

select *                              
from libname.tablename                    
where date_field >=                          
  year(current_date - 1 day) * 10000 +
  month(current_date - 1 day) * 100 + 
  day(current_date - 1 day)           

另一种方法是使用类似IDATE的工具。这使得数字到日期的转换更加容易。有关此选项的更多信息。

我从中学习了此技巧


YYYYMMDD这是一个很好的方法!我一直忘了
CHAR
可以让你指定日期格式。我不能相信这个答案。MIDRANGE-L列表的Birgitta Hauser在我遇到类似问题时向我发送了解决方案。因此,attribute.dmc的解决方案的链接确实有效,但它非常简短和优雅。回答得好。这种方法会导致问题。请参阅我的解决方案中的链接。我对一个最初有效的查询有问题,后来由于某种原因开始失败。啊,是的,其他考虑不周的过程输入的格式错误的日期。你有个好办法+1.这确实管用,我学到了一些处理日期的有用知识,太棒了。IDate不是一个选项,因为除了通过链接服务器只读外,我对系统没有任何真正的访问权限。如果你愿意添加另一个加入。。。他们有日历文件吗?这也将从结果中消除无效日期。当然,如果你能改变数据库中的类型最好——如果他们处理的是
*CYMD
日期,他们就有必要的设备在RPG程序中处理它;磁盘空间可能不再是一个真正的问题。特别是因为它可以防止无效数据。它可能是我遇到的设计最差的数据库。基本上不可能让他们做任何事情来改善它。即使是一个唯一的标识列也将是一个巨大的改进(与CustomerName、LogNumber和Date的PK相比)。我不确定他们是否听说过正常化这个词。也就是说,至少它不是CYMD日期格式。那可能会更糟。这是一个YYYYMMDD格式的整数字段,除非他们的系统出了问题,插入了一个0…#是的,不是实际的RPG日期格式
*CYMD
(这是一个3位数的年份,21世纪用“1”表示)。我想我已经处理了太多其他日期的事情——四位数年份的前两位数当然是世纪。
YYYYMMDD <= DEC(REPLACE(CHAR(CURRENT_DATE - 1 MONTH, ISO), '-', ''), 8, 0)