SQL Server 算术溢出错误 - 将 nvarchar 转换为 datetime
Posted
技术标签:
【中文标题】SQL Server 算术溢出错误 - 将 nvarchar 转换为 datetime【英文标题】:SQL Server Arithmetic Overflow Error - converting nvarchar to datetime 【发布时间】:2017-04-14 18:41:29 【问题描述】:我正在从视图中检索数据,我正在使用的列之一是 nvarchar(50)
,但只有 N'True'
或 N'False'
,具体取决于此父项中相关日期列的操作查看。
以下代码检索记录 ID 和我要查找的列 YTD
:
SELECT Enquiry_Number, YTD
FROM dbo.vw_SalesPO_YTD
输出:
ENQ-001 True
ENQ-002 False
ENQ-003 True
但是,由于某种原因,我无法使用此 YTD
列过滤我的结果。如果我尝试这样做:
SELECT Enquiry_Number, YTD
FROM dbo.vw_SalesPO_YTD
WHERE YTD = N'True'
然后它失败并出现以下错误:
将表达式转换为数据类型日期时间时出现算术溢出错误。
我不明白,因为此查询中没有 datetime
表达式。是的,True
或False
是通过比较父视图中的日期时间来确定的,但我不明白这可能是如何影响到这个子查询的。在父视图中尝试相同的操作会产生相同的错误 - 为了简单起见,我以这种方式进行演示。
但是,在查询的 SELECT
部分执行类似操作没有问题:
SELECT
Enquiry_Number,
YTD,
CASE
WHEN YTD = N'True' THEN 1 ELSE 0
END As C
FROM
dbo.vw_SalesPO_YTD
输出:
ENQ-001 True 1
ENQ-002 False 0
ENQ-003 True 1
但是,这些 1 和 0 继承了相同的缺陷,我无法在 WHERE
子句中使用它们而不会出现此日期时间错误。
我一直在努力寻找,但不确定如何确定核心问题。我一直在阅读有关排序规则和类型优先级的内容,但不明白为什么会发生这种行为。
当我在INFORMATION_SCHEMA.COLUMNS
中检查YTD
时,它确认此列与我表中的其他列没有什么不同:YTD
是nvarchar(50)
,使用Latin1_General_CI_AS
排序规则。
相关问题:SQL Server Arithmetic overflow error converting expression to data type datetime
问题的根源
此问题仍未解决,但如果您希望重现它,父视图中的此代码必须生成此问题:
CASE WHEN
Award_Date <= DATEFROMPARTS(FinancialYear - 1, 11, 1) + GETDATE() - DATEADD(year, DATEDIFF(month, '20161101', GETDATE()) / 12, '20161101')
THEN N'True'
ELSE N'False'
END
是的,这看起来过于复杂。我们正在检查 Award_Date
与它关联的 FinancialYear
,它从 11 月 1 日到 10 月 31 日运行。每条记录都已经知道它在哪个FinancialYear
中。最终目的是将 TODAY 的位置 (2016-11-30) 与去年的 TODAY (2015-11-30) 和前一年的 TODAY (2014-11-30) 进行比较等。
因此,代码采用今天的日期并将其与关联记录的FinancialYear
结合起来,并吐出该记录是否发生在其财政年度开始和同一财政年度的今天之间年。它成功地做到了这一点,但是我无法用它产生的N'True'
或N'False'
做任何事情。
【问题讨论】:
如果在查询中移动内部选择中的WHERE
条件(即(SELECT Enquiry_Number, YTD FROM dbo.vw_SalesPO_YTD WHERE YTD = N'True')
),你会得到什么,请注意,你是从SELECT * FROM...
开始的,而它应该是@ 987654352@(但不确定这与您的问题有关)。
完整性检查:SELECT * FRMO dbo.vw_SalesPO_YTD
是否成功完成? (确保在测试时强制所有行返回。)
@FDavidov - 谢谢,我已经简化了安装 SE 的问题,但没有注意到我可以将其缩减为仅外部查询!已在问题中进行了简化,但仍然失败。马特吉布森 - 是的,选择所有工作正常,我可以按除 YTD 之外的任何列过滤(WHERE)。
你试过WHERE YTD = 'True'
吗? (没有N
)
@FDavidov - 是的,同样的错误也会失败,就像将 WHERE 子句的两边显式转换为 nvarchar(50) 一样
【参考方案1】:
我不知道源 YTD 的类型是什么。
尝试使用以下方法:
SELECT Enquiry_Number, [YTD] FROM (
SELECT Enquiry_Number, CONVERT(nvarchar(10),YTD) AS [YTD] FROM dbo.vw_SalesPO_YTD
) AS A
WHERE A.YTD = N'True'
10 只是一个重击值。它将切割超过 10 个字段的任何部分。这取决于您的实际字段大小。
【讨论】:
【参考方案2】:SELECT *
FROM (SELECT Enquiry_Number, YTD
FROM dbo.vw_SalesPO_YTD) AS A
WHERE cast(A.YTD as varchar) = 'True'
【讨论】:
转换为varchar。不要进入 nvarchar 不要转换为 nvarchar 到目前为止,您还没有得到这个问题的任何答案?【参考方案3】:我以以下为例:
DECLARE @Data TABLE
(
Enquiry_Number nvarchar(10),
YTD nvarchar(50)
)
INSERT INTO @Data(Enquiry_Number, YTD)
SELECT N'ENQ-001', N'True' UNION
SELECT N'ENQ-002', N'False' UNION
SELECT N'ENQ-003', N'True'
SELECT Enquiry_Number, [YTD] FROM (
SELECT Enquiry_Number, CONVERT(nvarchar(10),YTD) AS [YTD] FROM @Data
) AS A
WHERE A.YTD = N'True'
结果:
ENQ-001 True
ENQ-003 True
YTD 字段中必须存在导致将其作为日期时间类型返回的结果。
尝试如下查询:
SELECT * FROM dbo.vw_SalesPO_YTD WHERE ISDATE(YTD)= 1
更新的问题: 试试:
ISNULL(CASE WHEN Award_Date <= DATEFROMPARTS(FinancialYear - 1, 11, 1) + GETDATE() - DATEADD(year, DATEDIFF(month, '20161101', GETDATE()) / 12, '20161101') THEN N'True' ELSE N'False' END, 'false')
【讨论】:
感谢@Danie - 您的代码成功运行并产生与我的原始代码相同的未过滤结果,但尝试按列过滤时仍然出现相同的错误。 并且作为记录,ISNULL 的替代结果永远不会在结果中触发 - 所有记录都显示 True 或 False,而不是 ISNULL 会产生的 false。 【参考方案4】:试试这个:- 不要在字符串前添加 n
SELECT *
FROM (SELECT Enquiry_Number, YTD
FROM dbo.vw_SalesPO_YTD) AS A
WHERE A.YTD = 'True'
【讨论】:
你能给我你在编码中的日期计算吗?这就是问题的根源 cast(cast(@yr_mnth_dt as char(8)) as datetime) 像这样转换你的日期然后计算。如果没有解决给我日期计算代码【参考方案5】:这是一个成功的解决方法,而不是解决方案本身或对核心问题的解释。
从视图中出来的数据显然存在问题,这将不允许在 WHERE
子句中对 YTD
列的结果进行操作,但是在查询到达其时可以对它们进行操作SELECT
阶段。
我创建了一个新的table
,它将YTD
列明确定义为nvarchar(50)
,然后将我视图中的所有记录插入到此表中,从而解决了问题。然后可以按YTD
对记录进行排序和过滤。
【讨论】:
以上是关于SQL Server 算术溢出错误 - 将 nvarchar 转换为 datetime的主要内容,如果未能解决你的问题,请参考以下文章
SQL / Python尝试检查数据是不是已存在:将nvarchar转换为数据类型数字的算术溢出错误
我的SQL 运行提示 DBA数据层_错误将 expression 转换为数据类型 int 时发生算术溢出错误
如何更正将 nvarchar 转换为 sql 数据类型 numeric(9, 4) 的数字的算术溢出错误? [关闭]
(SQL)将 expression 转换为数据类型 int 时发生算术溢出错误