【问题标题】:Where Clause Gives Error:"The conversion of a nvarchar data type to a datetime data type resulted in an out-of-range value."Where Clause Gives Error:“将 nvarchar 数据类型转换为 datetime 数据类型导致值超出范围。”
【发布时间】:2015-02-13 11:42:10
【问题描述】:
SELECT SchoolID
FROM   ParameterDetails
INNER JOIN
EstablishmentParameterValues AS v
ON v.ParameterID = ParameterDetailID
WHERE  NameResourceKey = 'NonTeachingStaffStartTime'
AND DATEDIFF(mi, CONVERT (DATETIME, (CONVERT (NVARCHAR (20), CONVERT (DATE, GETDATE()), 110) + ' ' + v.ParameterValue)), GETDATE()) <= 60

上面的查询给出了错误

将 nvarchar 数据类型转换为 datetime 数据类型导致值超出范围

当我使用 write 时

DATEDIFF(mi, CONVERT (DATETIME, (CONVERT (NVARCHAR (20), CONVERT (DATE, GETDATE()), 110) + ' ' + v.ParameterValue)), GETDATE()) <= 60

在Select Clause中它没有给出错误,那么为什么它在Where Clause中给出错误..

V.ParameterValues 表包含以下类型的值:-

8:45
8:45
08:40:00
08:30:00
8:45

【问题讨论】:

  • 你能说什么是v.ParameterValue值吗?
  • 如果ParameterValue 中有其他值与时间不相似(可能是NonTeachingStaffStartTime 以外的其他值),那么您可能注定要失败,直到将其拆分为两个单独的查询。无法保证评估 WHERE 子句参数的顺序,即使您例如将其中的一部分移到子查询中,总是有SQL Server should not raise illogical errors 通知您该策略不会保护您。
  • 以下是否有帮助,或者您仍然发现问题?

标签: sql sql-server sql-server-2008


【解决方案1】:

您的括号似乎放错了...并且 T-SQL 消息与您的数据无关。尝试更改:
CONVERT (NVARCHAR (20), CONVERT (DATE, GETDATE()), 110), 为
CONVERT (NVARCHAR (20), CONVERT (DATE, GETDATE(), 110)),
这样110就在括号内。

如果这不能解决您的问题,您可以尝试添加TOP 1(如SELECT TOP 1...)以确认您的基本代码有效(至少在第一行)。

您还可以检查未使用当前逻辑正确转换的值:使用 ISDATE 函数,其中“Returns 1 if the expression is a valid date, time, or datetime value; otherwise, 0”:
WHERE ISDATE( CONVERT(DATE,GETDATE(),110) + ' ' + v.ParameterValue ) = 0

希望对您有所帮助...

【讨论】:

    猜你喜欢
    • 2016-10-22
    • 2017-03-31
    • 1970-01-01
    • 2012-04-16
    • 2014-04-19
    • 1970-01-01
    • 2011-04-07
    • 2011-11-12
    相关资源
    最近更新 更多