【问题标题】:In SQL, can you write a where clause, if a date range falls within a date range在 SQL 中,如果日期范围在日期范围内,是否可以编写 where 子句
【发布时间】:2022-01-23 10:56:47
【问题描述】:

我处理患者信息,其中包含入院日期和出院日期。我有一个查询,我需要添加一个 WHERE 子句,该子句只能识别日期范围内的患者。

例如,我想从 2021 年 5 月 1 日到 2021 年 5 月 31 日将所有在医院的病人都拉出来。这将包括在 5 月任何时候入院/出院(以及介于两者之间的任何时间)的患者。

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 中的患者,因此它会生成此表:

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 月(或任何一个月)。

谢谢!!!

【问题讨论】:

  • 如果患者在 5 月底或之前入院并在 5 月初或之后出院,则该患者将在 5 月住院。
  • 您使用的是哪种 DBMS 产品? “SQL”只是所有关系数据库都使用的一种查询语言,而不是特定数据库产品的名称。请为您使用的数据库产品添加tagWhy should I tag my DBMS
  • 列 Admit_Date 和 Disch_Date 数据类型?
  • SQL Server 管理工作室。日期是 CONVERT(date,Admit_Date,102)。基本上只是日期,但我想我可以稍后转换为日期。

标签: sql date where-clause date-range


【解决方案1】:

您可能希望选择在月底之前入院和在月初之后出院的任何人 在你的 where 子句中使用类似的东西

where 
  Admit_Date <= '2021-05-31' and 
  Disch_Date >= '2021-05-01'

【讨论】:

    【解决方案2】:

    tl;博士

    SELECT *
    FROM event_ 
    WHERE start_ < '2021-06-01' 
    AND end_ !< '2021-05-01'
    ;
    

    半开

    通常最好将时间跨度定义为半开放,其中开始是包含,而结束是独占。因此,5 月份从 5 月 1 日开始,一直持续到但不包括 6 月 1 日。

    避免BETWEEN

    不要使用 SQL 命令BETWEEN 进行这项工作。该命令是完全关闭的而不是半打开的。

    重叠测试

    您的目标涉及重叠测试,其中行的日期范围既不完全在目标日期范围之前,也不完全在目标日期范围之后。换句话说,这两个范围共享时间线的某些部分。

    所以逻辑是:

    • 行开始在目标结束之前,并且
    • 行尾等于或晚于目标开始。

    在标准 SQL 代码中:

    SELECT *
    FROM event_ 
    WHERE start_ < '2021-06-01' 
    AND end_ >= '2021-05-01'
    ;
    

    “等于或晚于”的另一种说法是“不早于”。一些数据库支持使用!&lt;,尽管该运算符可能未在 SQL 标准中定义。

    SELECT *
    FROM event_ 
    WHERE start_ < '2021-06-01' 
    AND end_ !< '2021-05-01'
    ;
    

    【讨论】:

    【解决方案3】:

    对于在 5 月份内的录取期间,录取必须在 5 月底之前开始,并在 5 月初之后结束。这“感觉”不妥,但如果你自己用笔和纸画出时间线,你就能看出其中的逻辑。

    那么必要的查询是:

    SELECT * FROM admissions
    WHERE admit_date <= '2021-05-31' 
    AND disch_date >= '2021-05-01';
    

    【讨论】:

    • ANSI/ISO SQL 使用双引号作为标识符,这意味着"2021-05-31" 被读取为名为@9​​87654323@ 的列。单引号用于日期/时间和字符串文字。 (但是,一些 dbms 产品还有其他方法可以做到这一点 - 不幸的是。)
    猜你喜欢
    • 2019-07-15
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    相关资源
    最近更新 更多