SQL-запрос для получения пользователей на основе даты и месяца - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть следующая таблица:

Пользователь

  • Идентификатор_пользователь
  • CompanyID
  • Имя
  • IsActive
  • Date_Joined
  • 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 года, не считаются оплачиваемыми, даже если они и должны были присоединиться в 2017 году, а не в этом году лица, созданные в сентябре 2018 года, не должны рассматриваться как подлежащие оплате).

Как мне ввести год или оптимизировать мой запрос?

Ответы [ 4 ]

0 голосов
/ 05 сентября 2018

Я думаю, вам нужна проверка между датой начала текущего месяца и датой окончания. Попробуйте это

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
    )
0 голосов
/ 05 сентября 2018

Вы можете использовать как это

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())))
0 голосов
/ 05 сентября 2018

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)
    )
)
0 голосов
/ 05 сентября 2018
  • Я думаю, твои скобки сняты. Размещение их вокруг 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()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...