簡體   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