当我使用日期类型变量而不是硬编码日期时,为啥会出现“操作数类型冲突:日期与 int 不兼容”错误?

Posted

技术标签:

【中文标题】当我使用日期类型变量而不是硬编码日期时,为啥会出现“操作数类型冲突:日期与 int 不兼容”错误?【英文标题】:Why am I getting "Operand type ***: date is incompatible with int" error when I use a date type variable instead of hard coded date?当我使用日期类型变量而不是硬编码日期时,为什么会出现“操作数类型冲突:日期与 int 不兼容”错误? 【发布时间】:2019-07-17 08:06:40 【问题描述】:

当我在 WHILE 循环提到的条件中使用日期变量而不是硬编码日期时,为什么会出现“操作数类型冲突:日期与 int 不兼容”错误,我有点困惑。

Declare @ddate date='2013-03-25', @MembershipDate date= '2013-03-27',@id int=0
while (@ddate<=DATEADD(mm,3,@MembershipDate)-1) 
begin
set @id=@id+1
end

但如果我直接使用下面提到的硬编码日期,那么我不会收到任何错误

Declare @ddate date='2013-03-25',@id int=0
while (@ddate<=DATEADD(mm,3,'2013-03-27')-1) 
begin
set @id=@id+1
end

请告诉我原因。

【问题讨论】:

【参考方案1】:

因为当您使用字符串时,它会隐式转换为日期时间,而DATEADD 的结果是日期时间。

当您使用日期时,DATEADD 的结果是日期。

这是在the docs中指定的

DATEADD (datepart , number , date )

date 参数数据类型变为 DATEADD 返回值数据 类型,字符串文字日期值除外。对于字符串文字, DATEADD 返回一个日期时间值。

较新的日期和时间数据类型不支持这种类型的算术。您可以将DATEADDday-1 一起使用,从中减去一天。反正这更清楚了。

【讨论】:

谢谢。使用 GETDATE() 函数代替硬编码日期时没有错误,这是否意味着 GETDATE() 函数的返回类型是字符串?以及如何将 DATEADD 与 day 和 -1 一起使用,我的目标是找到提前 3 个月的日期,并减少 1 天。 No GETDATE 的返回类型也是 DATETIME。这是一种旧数据类型,其行为与 DATE 和 DATETIME2 等较新数据类型不同。您只需要将原始 DATEADD 表达式包装在另一个 DATEADD 中即可减去日期 Martin,您能否提及“将原始 DATEADD 表达式包装在另一个 DATEADD 中以减去日期”的确切语句/代码 @user DATEADD(DAY,-1,DATEADD(MONTH,3,@MembershipDate))

以上是关于当我使用日期类型变量而不是硬编码日期时,为啥会出现“操作数类型冲突:日期与 int 不兼容”错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥当我使用 .map 而不是硬编码来动态填充内容时,Material UI 选项卡停止工作?

使用 current_date::date 而不是硬编码日期的 Postgres 查询非常慢

为啥当我使用 IIF 时,我的表中的某些行而不是其他行的日期转换失败

为啥 Oracle ADD_MONTHS() 返回的 sysdate 值与我硬编码今天的日期不同?

在变量中设置日期格式

SQL 查询:分区计数因变量或硬编码参数而异