在SQL中,如果日期范围在日期范围内,你能写一个where子句吗
In SQL, can you write a where clause, if a date range falls within a date range
我处理患者信息,其中包含入院日期和出院日期。我有一个查询,我需要添加一个 WHERE 子句,该子句只能识别日期范围内的患者。
例如,我想把医院里从 5-1-2021 到 5-31-2021 的所有病人都拉出来。这将包括在 5 月的任何时间出现admit/discharge(以及介于两者之间的任何情况)的患者。
Hospital 1
Patient Admit_Date Disch_Date
1 4/5/2021 5/20/2021
2 5/6/2021 5/10/2021
3 4/10/2021 4/22/2021
4 4/19/2021 7/5/2021
5 6/1/2021 6/7/2021
我只想包括从 2021 年 5 月 1 日到 2021 年 5 月 31 日在医院 1 的患者,所以它会产生这个 table:
Hospital 1
Patient Admit_Date Disch_Date
1 4/5/2021 5/20/2021
2 5/6/2021 5/10/2021
4 4/19/2021 7/5/2021
我尝试使用 BETWEEN 子句,但它不包括像患者 #4 这样的患者,他们在 5 月之前入院,5 月之后出院,但在 5 月住院。基本上我正在尝试进行人口普查,所以我可以说在 5 月 4 日或 5 月 22 日等日有 XX 名患者,但整个 5 月(或任何一个月)。
谢谢!!!
tl;博士
SELECT *
FROM event_
WHERE start_ < '2021-06-01'
AND end_ !< '2021-05-01'
;
半开
通常最好将时间跨度定义为半开,其中开始是包含,而结尾是不包含。因此,5 月从 5 月 1 日开始,一直持续到但不包括 6 月 1 日。
避免BETWEEN
不要不要使用SQL命令BETWEEN
完成这项工作。该命令是全闭而不是半开。
重叠测试
您的目标涉及 重叠 测试,其中行的日期范围既不完全在目标日期范围之前,也不完全在目标日期范围之后。换句话说,这两个范围共享时间线的某些部分。
所以逻辑是:
- 行开始在目标结束之前,AND
- 行结束等于或晚于目标开始。
在标准 SQL 代码中:
SELECT *
FROM event_
WHERE start_ < '2021-06-01'
AND end_ >= '2021-05-01'
;
“等于或晚于”的另一种说法是“不早于”。某些数据库支持使用 !<
,尽管该运算符可能未在 SQL 标准中定义。
SELECT *
FROM event_
WHERE start_ < '2021-06-01'
AND end_ !< '2021-05-01'
;
对于 5 月份内的录取持续时间,录取必须在 5 月底之前开始,并在 5 月初之后结束。这“感觉”不对,但是如果你自己用笔和纸画出时间线,你就会明白其中的逻辑。
那么必要的查询是:
SELECT * FROM admissions
WHERE admit_date <= '2021-05-31'
AND disch_date >= '2021-05-01';
您可以选择月底前入院和月初后出院的人
在你的 where 子句中使用这样的东西
where
Admit_Date <= '2021-05-31' and
Disch_Date >= '2021-05-01'
我处理患者信息,其中包含入院日期和出院日期。我有一个查询,我需要添加一个 WHERE 子句,该子句只能识别日期范围内的患者。
例如,我想把医院里从 5-1-2021 到 5-31-2021 的所有病人都拉出来。这将包括在 5 月的任何时间出现admit/discharge(以及介于两者之间的任何情况)的患者。
Hospital 1
Patient Admit_Date Disch_Date
1 4/5/2021 5/20/2021
2 5/6/2021 5/10/2021
3 4/10/2021 4/22/2021
4 4/19/2021 7/5/2021
5 6/1/2021 6/7/2021
我只想包括从 2021 年 5 月 1 日到 2021 年 5 月 31 日在医院 1 的患者,所以它会产生这个 table:
Hospital 1
Patient Admit_Date Disch_Date
1 4/5/2021 5/20/2021
2 5/6/2021 5/10/2021
4 4/19/2021 7/5/2021
我尝试使用 BETWEEN 子句,但它不包括像患者 #4 这样的患者,他们在 5 月之前入院,5 月之后出院,但在 5 月住院。基本上我正在尝试进行人口普查,所以我可以说在 5 月 4 日或 5 月 22 日等日有 XX 名患者,但整个 5 月(或任何一个月)。
谢谢!!!
tl;博士
SELECT *
FROM event_
WHERE start_ < '2021-06-01'
AND end_ !< '2021-05-01'
;
半开
通常最好将时间跨度定义为半开,其中开始是包含,而结尾是不包含。因此,5 月从 5 月 1 日开始,一直持续到但不包括 6 月 1 日。
避免BETWEEN
不要不要使用SQL命令BETWEEN
完成这项工作。该命令是全闭而不是半开。
重叠测试
您的目标涉及 重叠 测试,其中行的日期范围既不完全在目标日期范围之前,也不完全在目标日期范围之后。换句话说,这两个范围共享时间线的某些部分。
所以逻辑是:
- 行开始在目标结束之前,AND
- 行结束等于或晚于目标开始。
在标准 SQL 代码中:
SELECT *
FROM event_
WHERE start_ < '2021-06-01'
AND end_ >= '2021-05-01'
;
“等于或晚于”的另一种说法是“不早于”。某些数据库支持使用 !<
,尽管该运算符可能未在 SQL 标准中定义。
SELECT *
FROM event_
WHERE start_ < '2021-06-01'
AND end_ !< '2021-05-01'
;
对于 5 月份内的录取持续时间,录取必须在 5 月底之前开始,并在 5 月初之后结束。这“感觉”不对,但是如果你自己用笔和纸画出时间线,你就会明白其中的逻辑。
那么必要的查询是:
SELECT * FROM admissions
WHERE admit_date <= '2021-05-31'
AND disch_date >= '2021-05-01';
您可以选择月底前入院和月初后出院的人 在你的 where 子句中使用这样的东西
where
Admit_Date <= '2021-05-31' and
Disch_Date >= '2021-05-01'