我在使用此代码时遇到麻烦。
(SELECT r.SITE_ID, count(distinct r.NIIN)
FROM
(SELECT t.SITE_ID, t.NIIN, B.DT_INVT, B.DT_CRTD,CAST(
case when
B.DT_INVT = '0000000' then B.DT_CRTD + 2000
when B.DT_INVT IS NULL then B.DT_CRTD + 2000
when B.DT_INVT = ' ' then B.DT_CRTD + 2000
ELSE B.DT_INVT + 2000
End as INT) As DueDate
FROM
(SELECT A.SITE_ID, A.NIIN
FROM DDCNENVR.QBO A
WHERE NOT (A.RIC IN ('SMS', 'S9W', 'S9D'))
and A.SITE_ID in ('HECL', 'HECN')
GROUP BY A.SITE_ID, A.NIIN) as t
inner join DDCNENVR.QBS B on t.NIIN = B.NIIN and t.SITE_ID = B.SITE_ID) as r
where r.DueDate between 2018206 and 2019273
GROUP BY r.SITE_ID)
相同的代码可用于某些数据库,但在其他数据库中将失败。
在不使用之间的Duedate语句导出数据之后,根据excel的列类型如下:
B.Dt_inv和B.dt_created是文本
过期出口为数字
答案 0 :(得分:0)
在Db2 V11.1.0.0及更高版本中,您可以使用诸如此类的函数来检查值是否可以为CAST到DECIMAL。
CREATE OR REPLACE FUNCTION IS_DECIMAL(s VARCHAR(255))
RETURNS SMALLINT
LANGUAGE SQL
CONTAINS SQL
DETERMINISTIC
NO EXTERNAL ACTION
RETURN
REGEXP_LIKE(s, '^\s*[+-]?\s*((\d+\.?\d*)|(\d*\.?\d+))\s*$')
像这样使用它
SELECT DT_INVT FROM DDCNENVR.QBS WHERE IS_DECIMAL(DT_INVT) = 0
它不是完美的,因为它不允许所有格式(例如1e3
可转换为DECIMAL,但此函数表示不是),但可以捕获例如12 34
不能转换为DECIMAL,而TRANSLATE
函数则不能。
它也不会检查字符串的长度以确保它不超过31个十进制数字。