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日,你需要吗?我相应地调整了查询。