SQL查询根据日期和月份检索用户

时间:2018-09-05 11:34:47

标签: sql sql-server tsql date datetime

我有下表:

用户

  • 用户ID
  • CompanyID
  • 名称
  • IsActive
  • 加入日期
  • Date_Left

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

  • 加入计费月份的用户不会被视为可计费用户。
  • 在帐单月份留下的用户 是可计费的用户。

我有以下查询:

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月创建的人员是可计费的。

如何实施年份或优化查询?

4 个答案:

答案 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())))