我有下表:
用户
我正在尝试查询以获取可计费用户,条件是:
我有以下查询:
SELECT * from user u WHERE CompanyID = 1205
AND (p.IsActive = 1 AND MONTH(p.Date_Joined) != MONTH(GETDATE())
OR (p.is_active = 0 AND MONTH(p.Date_Left) = MONTH(GETDATE())
问题在于此查询无法正常工作,因为它不检查用户的年份(2017年9月加入的用户不算是可计费的,即使他们应该在2017年而不是今年加入) ,则不应视为在2018年9月创建的人员是可计费的。
如何实施年份或优化查询?
答案 0 :(得分:5)
EOMONTH
可用于确定每月的最后一天。例如:
/* last day of prev month */ EOMONTH('2018-09-05', -1) = 2018-08-31
/* last day of curr month */ EOMONTH('2018-09-05') = 2018-09-30
您可以轻松检查活动用户是否在前一个月加入,或者在当前月份还剩下非活动用户,如下所示:
DECLARE @billdate AS DATE = '2018-09-05';
SELECT *
FROM user
WHERE CompanyID = 1205 AND (
(
IsActive = 1 AND
Date_Joined <= EOMONTH(@billdate, -1)
)
OR
(
IsActive = 0 AND
Date_Left > EOMONTH(@billdate, -1) AND
Date_Left <= EOMONTH(@billdate)
)
)
答案 1 :(得分:0)
AND
周围不会执行任何操作。您可能想将它们放在OR
周围。p
的目标表。从列名来看,我认为以其为前缀的列也来自user
,因此将别名更改为u
。year()
,类似于您使用month()
的方式。
SELECT *
FROM user u
WHERE u.companyid = 1205
AND (u.isactive = 1
AND month(p.date_joined) != month(getdate())
AND year(p.date_joined) = year(getdate())
OR u.is_active = 0
AND month(p.date_left) = month(getdate())
AND year(p.date_left) = year(getdate()));
答案 2 :(得分:0)
我认为您需要在当前月份的开始日期和结束日期之间进行检查。 试试这个
DECLARE @D_FROM_DATE DATE,@D_TO_DATE DATE
SELECT @D_FROM_DATE=DATEADD(DAY,-DATEPART(DAY,GETDATE()-1),GETDATE()),
@D_TO_DATE=DATEADD(MONTH,1,DATEADD(DAY,-DATEPART(DAY,GETDATE()),GETDATE()))
SELECT * FROM USER P
WHERE P.COMPANYID = 1205
AND
(
CAST(P.DATE_JOINED AS DATE) BETWEEN @D_FROM_DATE AND @D_TO_DATE
OR
CAST(P.DATE_LEFT AS DATE) BETWEEN @D_FROM_DATE AND @D_TO_DATE
)
答案 3 :(得分:-1)
您可以这样使用
SELECT * from user u WHERE CompanyID = 1205
AND (p.IsActive = 1 AND CONCAT(YEAR(p.Date_Joined),'/',MONTH(p.Date_Joined)) != CONCAT(YEAR(GETDATE()),'/',MONTH(GETDATE())))
OR (p.is_active = 0 AND CONCAT(YEAR(p.Date_Left),'/',MONTH(p.Date_Left)) = CONCAT(YEAR(GETDATE()),'/',MONTH(GETDATE())))