Sql 需要此字段与原来一样,编号;不是字符串

Sql 需要此字段与原来一样,编号;不是字符串,sql,ibm-midrange,db2-400,Sql,Ibm Midrange,Db2 400,在这个查询中,IBMi上的字段UAFLWD被定义为数字8 0。它实际上是一个日期字段YYYYMMDD。下面的代码将格式更改为字符串,称为now FOLLOWUP。 事实上,我希望这是一个数字,因为在报告工具中,我只想包括日期=到当前日期和上一个日期。我如何将此后续操作定义为一个数字 SELECT ALL T01.UAUSRN,

在这个查询中,IBMi上的字段UAFLWD被定义为数字8 0。它实际上是一个日期字段YYYYMMDD。下面的代码将格式更改为字符串,称为now FOLLOWUP。 事实上,我希望这是一个数字,因为在报告工具中,我只想包括日期=到当前日期和上一个日期。我如何将此后续操作定义为一个数字

SELECT                                                                              
  ALL       T01.UAUSRN,                                                             
            SUBSTR(DIGITS(UAFLWD),5,2) CONCAT '/' CONCAT SUBSTR(DIGITS(UAFLWD)      
            ,7,2) CONCAT '/' CONCAT SUBSTR(DIGITS(UAFLWD),3,2) AS FOLLOWUP,         
            (T01.UAENT#), T01.UASFX#, T02.ADENTN, T01.UANOTT, T01.UANOTL,  T02.ADLNM, T02.ADFNM,         
            T01.UAFLWD                                                              
  FROM      ASTDTA.NOTEHDUA T01 INNER JOIN                                            
            ASTDTA.ADRESsad T02                                                       
  ON        UAENT# = ADENT#                                                         
    AND     UASFX# = ADSFX#                                                         
  WHERE     UAFLWD BETWEEN 20000101 AND 20991231                                    
    AND     UAPRGD < 1                                                              
    AND     UANOTT = 'E'                                                            
  ORDER BY  001 ASC, 008 ASC                                   

首先想到的是使用cast:


这能解决你的问题吗

你到底在找什么?根据您的问题,它已经是数字,因此只需选择它而不进行任何转换:

SELECT
  ALL       T01.UAUSRN, UAFLWD AS FOLLOWUP,
            (T01.UAENT#), T01.UASFX#, T02.ADENTN, T01.UANOTT, T01.UANOTL,  T02.ADLNM, T02.ADFNM,         
            T01.UAFLWD                                                              
  FROM      ASTDTA.NOTEHDUA T01 INNER JOIN                                            
            ASTDTA.ADRESsad T02                                                       
  ON        UAENT# = ADENT#                                                         
    AND     UASFX# = ADSFX#                                                         
  WHERE     UAFLWD BETWEEN 20000101 AND 20991231                                    
    AND     UAPRGD < 1                                                              
    AND     UANOTT = 'E'                                                            
  ORDER BY  001 ASC, 008 ASC                                   

编辑我刚刚注意到UAFLWD已经包含在选择列表中,而没有在示例SQL中进行转换

这与转换有什么关系?您不需要修改WHERE子句吗?谢天谢地,这是一种可搜索的格式,但如果可能的话,列的类型仍应更改。问题是,如何忽略这样的日期:40/12/14 dd/mm/yy什么,列中有无效数据?那你应该把它清理干净。不报告只是掩盖了一个相当危险的缺陷。这不会显示任何后续内容。好的,问题是这个。UAFLWD,当我在crystal报告中使用该字段时,它会提供更多的数据输出。我必须进行全面检查,但其中一些是坏数据。我们似乎允许用户输入错误的日期。所以我猜在400上concat会拒绝坏数据,例如12个月后的一个月。我需要做的是,准确地转换400上的查询,因为这是真相的版本也许你需要告诉Crystal将字段视为字符串而不是日期,这样它就不会爆炸了?然后你可以让Crystal做一些字符串->日期转换和检查。
SELECT
  ALL       T01.UAUSRN, UAFLWD AS FOLLOWUP,
            (T01.UAENT#), T01.UASFX#, T02.ADENTN, T01.UANOTT, T01.UANOTL,  T02.ADLNM, T02.ADFNM,         
            T01.UAFLWD                                                              
  FROM      ASTDTA.NOTEHDUA T01 INNER JOIN                                            
            ASTDTA.ADRESsad T02                                                       
  ON        UAENT# = ADENT#                                                         
    AND     UASFX# = ADSFX#                                                         
  WHERE     UAFLWD BETWEEN 20000101 AND 20991231                                    
    AND     UAPRGD < 1                                                              
    AND     UANOTT = 'E'                                                            
  ORDER BY  001 ASC, 008 ASC