sql - 将 varchar 值转换为数据类型 int 时转换失败。[SQLSTATE 22018](错误 245)
问题描述
我有失败的 sql 作业,它会产生上述错误。该作业运行存储过程,所以我尝试运行该过程,以便我可以查明问题.. SP 出人意料地没有失败,但同时没有做这项工作(SP 应该将数据插入到另一个没有做的表中)。我已经彻底查看了 SP,我认为下面的行可能是问题??
我试图在最后添加 cast as varchar 但没有用。下面的行应该计算客户年龄并将其插入“年龄”列数据类型数字(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
解决方案
试试这个,这是一种更清洁的方法,并且根据您的数据类型可能会有不同的行为。
DATEDIFF(
YEAR,
ISNULL(d.DateofBirth, c.dob),
COALESCE(
CAST(NULLIF(c.datedeath, '00000000') AS DATE),
c.DateofAttendance,
GETDATE()
)
)
如果这没有帮助,请确认您在此表达式中引用的列的确切数据类型。
如果这没有帮助,分一杯羹征服你的 SP。正如@JeroenMostert 所说;依次执行 SP 的每个部分,直到您严格确定它的哪个部分实际产生了错误。
例如,在上面的表达式中,如果它产生错误,您可以尝试 Just the COALESCE()
part,看看它是否有效......
COALESCE(
CAST(NULLIF(c.datedeath, '00000000') AS DATE),
c.DateofAttendance,
GETDATE()
)
最后,出于对所有美好事物的热爱,请考虑修改您的数据结构,以便将日期实际保存为 DATE 而不是 VARCHAR 或 INT。
推荐阅读
- wordpress - Wordpress 仪表板半黑屏
- php - Laravel 验证 url 名称和协议
- tensorflow - 无法从 Google Cloud VM 实例连接到 TensorBoard 页面
- php - 在 Woocommerce 中创建新产品时,默认将纳税状态设置为无
- google-maps - 使用 Flutter 的反应式/动态标记
- php - 如何允许使用 chrome 在我的本地 Apache Web 服务器中呈现 CSS 内容?
- c - 为什么 malloc 钩子对 pthread 不安全?
- python - 尝试使用 BeautifulSoup 获取元数据时出现意外结果
- flutter - 将模型中的列表保存为 Firestore 中的集合
- r - 在 Mac OSX 上运行的 R Studio 中安装 rJava 和 xlsx