【问题标题】:SQL Server : conversion failed when converting date and/or time from character stringSQL Server:从字符串转换日期和/或时间时转换失败
【发布时间】:2016-09-01 16:39:35
【问题描述】:

我正在 Microsoft SQL Server 2012 中创建一个过程,但我遇到了问题。错误信息是:

消息 241,第 16 级,状态 1,第 4 行
从字符串转换日期和/或时间时转换失败。

这是我的程序:

DECLARE @name varchar(255)

SELECT name 
FROM sysobjects 
WHERE type = 'P' 
  AND (name LIKE 'pr_My_app_log_%' OR name LIKE 'pr_My_item_log_%') 
  AND (DATEDIFF(dd, getdate(), RIGHT(name, 8)) < -2)

我的数据库中有这些名称的过程:

pr_My_app_log_20160830
pr_My_app_log_20160829

DATEDIFF 应该有问题。有人可以帮我更正查询并解释一下问题吗?

谢谢。

【问题讨论】:

  • 这是因为您在 sysobjects 中有行,其中右 8 个字符不是有效日期。仅仅因为 datediff 谓词在你的代码中是最后的并不意味着引擎会最后做那个检查。
  • 这不是万无一失的,但它可能足以满足您的目的:and case when right(name, 8) like '20[0-9][0-9][0-1][0-9][0-3][0-9]' then datediff(dd, getdate(), right(name, 8) end &lt; -2

标签: sql-server procedure


【解决方案1】:

当对象名称的最后 8 个字符无法解析为 DATETIME 时,您正在向 DATEDIFF 函数传递一个非数字值。

尝试在 where 子句中添加检查:

SELECT name
FROM sysobjects
WHERE type = 'P'
AND (name LIKE 'pr_My_app_log_%' OR  name LIKE 'pr_My_item_log_%')
AND TRY_CONVERT(DATETIME, RIGHT(name, 8)) IS NOT NULL -- check for non-numeric
AND (DATEDIFF(dd,  GETDATE(), RIGHT(name, 8) ) < -2)

【讨论】:

  • 你需要把try_parse()放在datediff()里面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多