早上好,
我有一个半功能 SQL 查询将数据从 IBM AS/400 提取到 Microsoft Excel。数据在 Microsoft Query 中正确显示,但是当我单击“返回数据”将数据返回到 Excel 时,我收到以下错误消息:
[IBM][System i Access ODBC Driver][DB2 for i5/OS]SQ20448 - Expression not
valid using format string specified for TIMESTAMP_FORMAT.
本质上,我的代码加入了一些文件,为我提供项目信息,并使用日期删除重复项,以便我可以获得最新的交易。
我对正常运行的其他文件使用了几乎相同的代码,因此我怀疑我的原始数据中可能存在格式不正确的日期,这会在使用 TO_DATE 函数将 IBM 日期转换为 Microsoft 兼容日期时导致错误。我知道我的日期转换工作正常,因为 IBM 日期是实际日期。
我的问题是,我如何在异常中编码以忽略格式不正确的数据,或者我如何返回格式不正确的数据以便我可以在我的代码中编写异常?
这是我的代码(希望评论有帮助):
SELECT xh.ITNBR, yh.VNDNR, zh.VN35VM, yh.BUYNO, xh.Create_Date -- Item #, Vendor #, Vendor Name, Buyer, Create_Date
FROM
(SELECT PO_IH.ITNBR, -- Item #
max(TO_DATE((CONCAT(
CONCAT(
(CONCAT(SUBSTRING(PO_MH.ACTDT,4,2), '/')),
(CONCAT(SUBSTRING(PO_MH.ACTDT,6,2), '/'))),
SUBSTRING(PO_MH.ACTDT,2,2))), 'MM/DD/YY')) as Create_Date -- Converts IBM date format to work with Microsoft Query
FROM POHISTI as PO_IH, POHSTM as PO_MH
WHERE PO_IH.ORDNO = PO_MH.ORDNO AND
(TO_DATE((CONCAT(
CONCAT(
(CONCAT(SUBSTRING(PO_MH.ACTDT,4,2), '/')),
(CONCAT(SUBSTRING(PO_MH.ACTDT,6,2), '/'))),
SUBSTRING(PO_MH.ACTDT,2,2))), 'MM/DD/YY')) =
(SELECT MIN((TO_DATE((CONCAT(
CONCAT(
(CONCAT(SUBSTRING(PO_MH.ACTDT,4,2), '/')),
(CONCAT(SUBSTRING(PO_MH.ACTDT,6,2), '/'))),
SUBSTRING(PO_MH.ACTDT,2,2))), 'MM/DD/YY'))) -- All of this chaos basically removes duplicate information and converts IBM date
FROM POHSTM as PO_MH2
WHERE PO_MH.ORDNO = PO_MH2.ORDNO AND
PO_MH.ACTDT NOT LIKE '0%' AND -- Removes dates that start with 0 (i.e. IBM's way of saying "no date")
PO_MH.ACTDT NOT LIKE '9%') -- Removes dates from 20th century
GROUP BY PO_IH.ITNBR) xh
LEFT JOIN
(SELECT PO_IH2.ITNBR, -- Item #
PO_IH2.BUYNO, -- Buyer
PO_IH2.VNDNR, -- Vendor
(TO_DATE((CONCAT(
CONCAT(
(CONCAT(SUBSTRING(PO_MH2.ACTDT,4,2), '/')),
(CONCAT(SUBSTRING(PO_MH2.ACTDT,6,2), '/'))),
SUBSTRING(PO_MH2.ACTDT,2,2))), 'MM/DD/YY')) as Create_Date
FROM POHISTI as PO_IH2, POHSTM as PO_MH2
WHERE PO_IH2.ORDNO = PO_MH2.ORDNO AND
PO_MH2.ACTDT NOT LIKE '0%' AND -- Removes dates that start with 0 (i.e. IBM's way of saying "no date")
PO_MH2.ACTDT NOT LIKE '9%') yh -- Removes dates from 20th century
ON xh.ITNBR = yh.ITNBR AND xh.Create_Date = yh.Create_Date
LEFT JOIN VENNAML0 zh -- Vendor Name
ON yh.VNDNR = zh.VNDRVM
这是 Microsoft Query 中的输出:
ITNBR VNDNR VN35VM BUYNO CREATE_DATE
A-FUL 76 HOLLAND COMP SUSY 2016-12-06 00:00:00.000000
A-MINI 76 HOLLAND COMP SUSY 2016-11-28 00:00:00.000000
A-SHIMBOX 76 HOLLAND COMP SUSY 2014-10-16 00:00:00.000000
A-001 76 HOLLAND COMP SUSY 2016-12-19 00:00:00.000000
A-002 76 HOLLAND COMP SUSY 2016-12-19 00:00:00.000000
....
就像我说的,信息在 Microsoft Query 中完美显示,但是当我将它返回到 Excel 时,我得到了上述错误。我尝试使用上面的“NOT LIKE”语句来处理两个最常见的错误,但我不知道如何找到其他错误。
我真的不在乎我是否得到了错误的数据,只要它转储到 Excel 中。到时候我就可以改正了。但我怀疑如果 Microsoft Query 不能转换日期,它不会将数据返回到 Excel。
谢谢。