簡體   English   中英

SQL查詢根據日期和月份檢索用戶

[英]SQL Query to retrieve users based on date and month

我有下表:

用戶

  • 用戶身份
  • CompanyID
  • 名稱
  • 活躍
  • 加入日期
  • 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月創建的用戶不應被視為可計費的)。

如何實施年份或優化查詢?

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)
    )
)
  • 我認為您的括號不對了。 將它們放在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()));

我認為您需要在當前月份的開始日期和結束日期之間進行檢查。 嘗試這個

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
    )

你可以這樣使用

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM