我有失败的sql作业,它会产生上述错误。该作业运行存储过程,因此我尝试运行该过程,以便我可以查明问题所在。.SP意外地没有失败,但同时没有执行该作业(SP应该将数据插入到另一个未执行的表中)。我已经仔细检查了SP,并且我认为以下一行可能是问题所在
我试图在最后添加类型转换为varchar,但没有用。下一行应计算客户年龄并将其插入“年龄”列数据类型numeric(18,6)。
列类型:
d.DateofBirth Date
c.dob DateTime
c.datedeath varchar(50)
c.DateofAttendance DateTime
请问有人可以帮忙吗???
CAST(DATEDIFF(DAY, ISNULL(d.DateofBirth, c.dob),ISNULL(CAST(CASE WHEN
c.datedeath = '00000000' THEN NULL ELSE c.DateDeath END AS DATE),
ISNULL(c.DateofAttendance,GETDATE()))) / 365.25 AS INT) AS age
答案 0 :(得分:-1)
尝试一下,这是一种更干净的方法,并且根据您的数据类型可能会有不同的行为。
DATEDIFF(
YEAR,
ISNULL(d.DateofBirth, c.dob),
COALESCE(
CAST(NULLIF(c.datedeath, '00000000') AS DATE),
c.DateofAttendance,
GETDATE()
)
)
如果这样做没有帮助,请确认您在此表达式中引用的列的确切数据类型。
如果那没有帮助,请分而治之。正如@JeroenMostert所说的;依次执行SP的每个部分,直到您严格确定了SP的哪一部分真正产生了错误为止。
例如,在上面的表达式中,如果它生成错误,则可以尝试仅使用COALESCE()
部分,然后查看该部分是否有效...
COALESCE(
CAST(NULLIF(c.datedeath, '00000000') AS DATE),
c.DateofAttendance,
GETDATE()
)
最后,出于对万物的热爱,请考虑修改数据结构,以使日期实际上保留为DATE,而不是VARCHAR或INT。