[英]How to fix the error - Operand type clash: date is incompatible with int
[英]Operand type clash: date is incompatible with int?
有人可以在这里帮我吗,我有以下TSQL引发错误(它是表视图的一部分)。
SELECT MAX([WEEK]) FROM MyTable WHERE [Year] = DATEPART(YYYY, GETDATE())
这是一个View Case语句的一部分,例如:
CASE
WHEN [WEEK] <= (SELECT MAX([WEEK]) FROM MyTable WHERE [Year] = DATEPART(YYYY, GETDATE())) THEN
[YEAR]
END YTD,
这将引发错误:操作数类型冲突:日期与int不兼容
该表定义为:
CREATE TABLE [dbo].[MyTable](
[Week] [tinyint] NULL,
[Year] [date] NULL,
) ON [PRIMARY]
GO
如何在不更改表字段类型的情况下使TSQL工作?
[年份]字段包含YYYY-MM-DD格式的记录。
这是在SQL Server 2016上。
将date
列year
称为一个非常差的命名选择。
您发布的SQL语句似乎是完全合理的-因为当您看到名为year
的列时year
您希望它包含Year(意思是int),而不包含日期值。
您应该考虑重命名该列或更改其数据类型,只是为了节省可怜的混蛋的时间,这些混蛋必须从现在开始每年对此代码进行维护工作,因为可能是您自己。
比起说的话, Year()
函数返回一个int值-自然地,这样的值不能与日期值进行比较-您如何将532与2019年5月1日进行比较? 比较苹果和橘子。
您有一个SARGable选项和一个非SARGable选项来解决此问题。
简而言之,SARGable表示在相关索引存在时允许数据库引擎使用索引查找的条件。
约翰·卡佩莱蒂(John Cappelletti)在评论中建议使用non-SARGable选项-将datepart
用于列和值:
WHERE datepart(YEAR,[Year]) = DATEPART(YEAR, GETDATE())
如果您在year列中没有索引,或者表不是很大,那么索引扫描与索引查找实际上不是问题,或者选择速度不是问题,那么这是一个不错的选择。
SARGable选项使用的条件略有不同-就像HABO在他的评论中建议的 (尽管我认为我的版本稍微简单一些):
WHERE [Year] => DATEFROMPARTS(DATEPART(YEAR, GETDATE()), 1, 1)
AND [Year] < DATEFROMPARTS(DATEPART(YEAR, GETDATE()) + 1, 1, 1)
当“ Year
列上有一个索引并且该表足够大时,这是一个更好的选择,这样索引扫描与索引查找将对选择性能产生足够大的影响。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.