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