当我使用日期类型变量而不是硬编码日期时,为啥会出现“操作数类型冲突:日期与 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 返回一个日期时间值。
较新的日期和时间数据类型不支持这种类型的算术。您可以将DATEADD
与day
和-1
一起使用,从中减去一天。反正这更清楚了。
【讨论】:
谢谢。使用 GETDATE() 函数代替硬编码日期时没有错误,这是否意味着 GETDATE() 函数的返回类型是字符串?以及如何将 DATEADD 与 day 和 -1 一起使用,我的目标是找到提前 3 个月的日期,并减少 1 天。 No GETDATE 的返回类型也是 DATETIME。这是一种旧数据类型,其行为与 DATE 和 DATETIME2 等较新数据类型不同。您只需要将原始 DATEADD 表达式包装在另一个 DATEADD 中即可减去日期 Martin,您能否提及“将原始 DATEADD 表达式包装在另一个 DATEADD 中以减去日期”的确切语句/代码 @userDATEADD(DAY,-1,DATEADD(MONTH,3,@MembershipDate))
以上是关于当我使用日期类型变量而不是硬编码日期时,为啥会出现“操作数类型冲突:日期与 int 不兼容”错误?的主要内容,如果未能解决你的问题,请参考以下文章
为啥当我使用 .map 而不是硬编码来动态填充内容时,Material UI 选项卡停止工作?
使用 current_date::date 而不是硬编码日期的 Postgres 查询非常慢
为啥当我使用 IIF 时,我的表中的某些行而不是其他行的日期转换失败