You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL中DATEDIFF返回合同首月应为1的查询逻辑修正问询

回答

1. 你修改后的SQL存在的问题

首先是语法错误:DATEDIFF(year, c.startDate, getdate() <> 0)写法完全错误,getdate() <> 0是布尔判断,不能作为DATEDIFF的第三个参数,正确写法应该是DATEDIFF(year, c.startDate, getdate()) <> 0。

其次逻辑完全不符合需求:
你要的是“仅当年份和月份差值都为0时,应用AND条件”,但你写的(DATEDIFF(MONTH,...) <>0 AND DATEDIFF(YEAR,...) <>0)是要求月份差不为0且年份差不为0才满足该条件,刚好和你要的逻辑相反。

2. 符合需求的正确逻辑

你的核心需求是:排除DATEDIFF(MONTH, ...)等于1的记录,同时把“同一年同月”(年月差都为0)的情况也当作差值1来排除,剩下的记录保留。

正确的WHERE条件有两种写法:

写法一:直接组合条件

WHERE DATEDIFF(MONTH, c.startDate, getdate()) <> 1
  AND NOT (DATEDIFF(YEAR, c.startDate, getdate()) = 0 AND DATEDIFF(MONTH, c.startDate, getdate()) = 0)

写法二:用CASE修正差值后判断

WHERE CASE 
        WHEN DATEDIFF(YEAR, c.startDate, getdate()) = 0 AND DATEDIFF(MONTH, c.startDate, getdate()) = 0 THEN 1
        ELSE DATEDIFF(MONTH, c.startDate, getdate())
      END <> 1

3. 逻辑验证

用正确逻辑测试你的案例:

  • 第一条(同一年同月):修正后差值为1,1<>1为假,记录被排除,符合期望。
  • 第二条(差值1):1<>1为假,记录被排除,符合期望。
  • 第三条(差值2):2<>1为真,记录被保留,符合期望。
  • 第四条(差值12):12<>1为真,记录被保留,符合期望。

而你修改后的逻辑(修正语法错误后)会错误排除第三条记录:因为第三条年份差为0,DATEDIFF(YEAR,...) <>0为假,括号内条件为假,整个WHERE条件是真 AND 假=假,导致第三条被排除,不符合你的需求。


内容的提问来源于stack exchange,提问作者dotnetdevcsharp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 13:50:25