我试图撤回在特定月份,某个会员类型,活跃且在过去30天内已检入设施的生日的记录。但我对30逻辑有困难。我尝试计算MS SQL中查询错误的日期的每一种方式。
我一直收到与日期计算相关的语法错误。
SELECT
MEMBERS.scancode, MEMBERS.lname, MEMBERS.fname, MEMBERS.dob,
MEMBERS.status, MEMBERTYPES.description, MEMBERS.mtypeid,
SITES.sitename, MEMBERS.email
FROM MEMBERS
INNER JOIN SITES ON MEMBERS.siteid = SITES.siteid
INNER JOIN MEMBERTYPES ON MEMBERS.mtypeid = MEMBERTYPES.mtypeid
WHERE (MEMBERS.siteid = @rvSite)
AND (MEMBERS.status = 'A')
AND (MONTH(MEMBERS.dob) = @rvMonth)
AND (MEMBERS.relationship = 'M')
AND (MEMBERS.mtypeid IN (1, 10, 12, 22, 28, 32, 33, 34, 35, 36, 40, 48))
AND (DATEDIFF(MEMBERS.lastvisit, GETDATE()) <= 30)
答案 0 :(得分:1)
DATEDIFF
函数需要3个参数datepart , startdate , enddate
。您错过了查询中的第一个参数(datepart)。将其更改为
DATEDIFF(DD,MEMBERS.lastvisit, GETDATE()) <= 30
答案 1 :(得分:0)
我在这里要做的一件事就是稍微更改一下这个逻辑,因为当你在一个函数中包装一个列时,它不再是SARGable,因此该列上的任何索引都是无用的。
以下是编写此查询的另一种方法,即SARGable。
MEMBER.lastvisit <= DATEADD(DAY, -30, GETDATE())