sql - SQL查询根据日期和月份检索用户
问题描述
我有下表:
用户
- 用户身份
- 公司编号
- 姓名
- 活跃
- 加入日期
- 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)
)
)
推荐阅读
- pandas - ValueError:当 HDF5 文件包含多个数据集时必须提供密钥,同时在 pandas 中读取 h5 文件我收到此错误
- php - 如何将会话 ID 与全部请求一起存储?
- php - Laravel 5.7 错误返回 response()->json(['content'=>'a
b]); 然后它变成 - java - 如何使用 Java 机器人类获取按键欧洲“è”字符
- if-statement - 使用 if 和 Else 在 R 中渲染文本时出现问题
- python - 如何使用 Python 从 USB 读取数据?(pyUSB)
- javascript - v模型值变化时触发哪个事件
- google-sheets - 条件格式 - 一个范围内的单元格具有来自另一个范围的匹配值
- sorting - 如何检查自定义结构的切片是否已排序?
- python - 计算数据帧两列之间的小时或秒时间差