繁体   English   中英

操作数类型冲突:日期与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上。

dateyear称为一个非常差的命名选择。
您发布的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM