在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'