【发布时间】: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) 一样
标签: sql sql-server datetime sqldatatypes