首页 > 解决方案 > SQL查询根据日期和月份检索用户

问题描述

我有下表:

用户

我正在尝试查询以获取可计费用户,标准是:

我有以下查询:

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 月创建的人不应被视为可计费的)。

如何实现年份或优化我的查询?

标签: sqlsql-servertsqldatedatetime

解决方案


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)
    )
)

推荐阅读