在WHERE语句中处理日期比较

时间:2016-10-24 17:47:44

标签: sql sql-server

我试图撤回在特定月份,某个会员类型,活跃且在过去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)

2 个答案:

答案 0 :(得分:1)

DATEDIFF函数需要3个参数datepart , startdate , enddate。您错过了查询中的第一个参数(datepart)。将其更改为

DATEDIFF(DD,MEMBERS.lastvisit, GETDATE()) <= 30

答案 1 :(得分:0)

我在这里要做的一件事就是稍微更改一下这个逻辑,因为当你在一个函数中包装一个列时,它不再是SARGable,因此该列上的任何索引都是无用的。

以下是编写此查询的另一种方法,即SARGable。

MEMBER.lastvisit <= DATEADD(DAY, -30, GETDATE())