mysql - 查找搜索日期之间的对应行
问题描述
我有两个具有这种相关结构和数据的表
CREATE TABLE "beneficiaries" (
"id" integer not null primary key autoincrement
);
CREATE TABLE "beneficiary_dates" (
"id" integer not null primary key autoincrement,
"opening_date" datetime null,
"closing_date" datetime null,
"beneficiary_id" integer not null,
foreign key("beneficiary_id") references "beneficiaries"("id")
)
INSERT INTO "beneficiary_dates" VALUES (1,'2020-02-01 15:08:28','2020-02-05 19:21:51',1);
INSERT INTO "beneficiary_dates" VALUES (2,'2020-04-01 15:08:28',NULL,2);
INSERT INTO "beneficiary_dates" VALUES (3,'2020-04-01 15:08:28','2020-04-29 19:21:51',3);
INSERT INTO "beneficiary_dates" VALUES (4,'2020-06-01 15:08:28',NULL,4);
我在用户可以通过的前端创建一个搜索过滤器
- 开始搜索日期
- 结束搜索日期
现在我正在尝试检索在开始日期和结束日期之间打开的受益人。已打开的受益人是与开始和结束搜索日期所在的期间(opening_date -- closing_date)匹配的受益人。
例如:
- 开始搜索日期 = 2020-01-01
- 结束搜索日期 = 2020-05-01
beneficiary_dates 中的行
1 | 2020-02-01 | 2020-02-05 | 1
2 | 2020-04-01 | null | 2
3 | 2020-04-01 | 2020-04-29 | 3
4 | 2020-06-01 | null | 4
SQL 请求必须返回第 1-2-3 行
解决方案
根据您的数据和所需的输出,它可能类似于
DECLARE @InOpeningDate DATE='2020-01-01';
DECLARE @InClosingDate DATE='2020-05-01';
WITH BENEFICIARY_DATES(ID,OPENING_DATE,CLOSING_DATE,BENEFICIARY_ID) AS
(
SELECT 1, '2020-02-01', '2020-02-05' , 1
UNION ALL
SELECT 2 , '2020-04-01', null ,2
UNION ALL
SELECT 3, '2020-04-01' ,'2020-04-29', 3
UNION ALL
SELECT 4 , '2020-06-01' , null , 4
)
SELECT B.ID,B.OPENING_DATE,B.CLOSING_DATE,B.BENEFICIARY_ID
FROM BENEFICIARY_DATES AS B
WHERE B.OPENING_DATE BETWEEN @InOpeningDate AND @InClosingDate
AND ISNULL(B.CLOSING_DATE,@InClosingDate)<=@InClosingDate
我还建议您对 CloseDate 列使用类似 '9999-12-31' 而不是 NULL
推荐阅读
- arrays - R:将数据框转换为三维数组?
- php - 如何使用高级自定义字段在选择字段中显示重复字段?
- php - PHP foreach 没有通过 JSON 文件循环
- c# - Unity-将图像上传到 Firebase 存储后如何获取下载 URL?
- postgresql - 如何修复“缺少表的 FROM 子句条目”错误
- sql-server - 无法从 base64 转换为任何有意义的东西
- java - 即使标签具有不同的值,如何确定两个 XML 文件是否具有相同的结构?
- java - 如何修复 Spring Boot 中的“postgresql 配置”null 错误
- java - 如何将多个列表中的值写入新的 csv 文件?
- javascript - SVG 变形不平滑变形 - 动漫 js