[英]SQL Query to retrieve users based on date and month
我有下表:
用戶
我正在嘗試查詢要計費的用戶,條件是:
我有以下查詢:
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.