Sql server SQL根据加入和离开日期获取活动用户
我有下表: 人Sql server SQL根据加入和离开日期获取活动用户,sql-server,Sql Server,我有下表: 人 用户ID 名字 创建日期 离开的日期 我的行: -- Datetime format MM-DD-YYYY userID Name date_created date_left 1 aa 01-01-2018 NULL 2 bb 01-01-2018 11-15-2018 3 cc 06-20-2018 NULL 4 dd 03-03-2018
- 用户ID
- 名字
- 创建日期
- 离开的日期
-- Datetime format MM-DD-YYYY
userID Name date_created date_left
1 aa 01-01-2018 NULL
2 bb 01-01-2018 11-15-2018
3 cc 06-20-2018 NULL
4 dd 03-03-2018 11-13-2018
5 ee 11-08-2018 11-30-2018
6 ff 12-01-2018 NULL
我还有一个发票期日期(月和年)
我想做的是根据发票周期获取活动用户的列表
我的理想结果:
如果发票月份=11,年份=2018:
应显示用户1、3、5
选择用户5的原因:
如果用户在同一个月加入并离开,他将被视为处于活动状态,但如果用户在该月离开并且加入日期小于发票月份,则该用户将不处于活动状态(因为该用户在发票月份离开,但加入时间更早)
如果发票月份=12,年份=2018:
应显示用户1、3、6
因此:
我还想检索已经离开的用户的结果(并根据过去的月份和年份检查他们是否处于活动状态)。这意味着我还希望能够动态检查处于活动状态的用户
这是我的疑问:
GO
DECLARE @month int, @year int;
SET @month = 12;
SET @year = 2018;
SELECT * FROM PERSON
WHERE (month(date_created) = @month -1 ) OR (MONTH(date_created) < @month AND YEAR(date_created) = @year AND date_left = null)
GO
声明@month int,@year int;
设置@month=12;
设置@year=2018年;
从个人中选择*
其中(月(创建日期)=@month-1)或(月(创建日期)<@month和YEAR(创建日期)=@YEAR和date\u left=null)
但这仍然会回报所有人
我做错了什么 假设您希望与当前日期进行比较。那就这样试试
SELECT * FROM Person
WHERE DATEDIFF(m,date_created,GETDATE())=1 AND date_left IS NULL
活动用户被视为创建日期早于一个月的用户,类似的操作应该可以:
DECLARE @month int, @year int, @dateToCheck datetime;
SET @month = 12;
SET @year = 2018;
SET @dateToCheck = dateadd(month, 1, datefromparts(@year, @month, 1))
SELECT *
FROM PERSON
WHERE date_created < @dateToCheck
AND (date_left is null or date_left >= @dateToCheck)
声明@month int、@year int、@dateToCheck datetime;
设置@month=12;
设置@year=2018年;
设置@dateToCheck=dateadd(月,1,datefromparts(@year,@month,1))
选择*
从个人
创建日期的位置<@dateToCheck
和(date_left为空或date_left>=@dateToCheck)
因此,如果您的月份是11,2018年@datetocheck将是2018-12-01,您将在2018-11-30或之前创建任何人,并在2018-12-01或之后保留空日期
如果您的月份是12,年份是2018,@datetocheck将是2018-12-31,您将获得在2018-12-31或之前创建的任何人,这些人的日期_left=null或日期在2019-01-01或之后,您可以提供示例查询以生成基础数据吗?如果您添加预期和当前结果会更好!我在@PrashantPimpale
date\u created字段末尾添加了一些信息,这些信息等于过去的月份??还是不到一个月?您的逻辑不清楚,因为您的数据和日期都不在november@JuanCarlosOropeza我已经更新了我的问题,很抱歉造成混淆。我认为这是可行的,但您需要计算月份-1
以与创建的日期进行比较@JuanCarlosOropeza您确定需要吗?由于如果月=1
和年=2019
是,查询也需要工作,因此从@dateToCheck
中减去,而不是从@month
中减去。无论如何,从@dateToCheck中减去一个月将只包括11月1日之前创建的用户。您需要明确自己想要什么:鉴于2018年12月,您希望所有用户都在2018年12月或之前创建,并且在2018年12月1日之前还没有离开?所以,如果某人是在12月2日创建的,但在12月10日离开,你不需要他们,但如果他们是在2019年11月30日创建的,离开1月1日,你需要吗?我相应地调整了查询。