【问题标题】:MySQL How to select a date record between the min and maxMySQL如何在最小值和最大值之间选择日期记录
【发布时间】:2018-03-17 11:51:25
【问题描述】:

假设我有四个日期,例如:

  • 2018 年 1 月 1 日
  • 2018 年 2 月 5 日
  • 2018 年 4 月 8 日
  • 2018 年 9 月 9 日

我想在最小值和最大值之间“选择”一个日期。仅限 2/5/2018 记录或 4/8/2018 记录。

我想我已经接近了,但是这个查询返回了所有的行:

SELECT * FROM RUBERIC R  
WHERE R.SCHOOLID = 75 
AND R.TEACHERID = 610 
AND R.OBSERVED = 'Observed Classroom' 
AND R.DATE BETWEEN 
(SELECT MIN(DATE) FROM RUBERIC WHERE R.SCHOOLID = 75 
AND R.TEACHERID = 610 AND R.OBSERVED = 'Observed Classroom' )
AND
(SELECT MAX(DATE) FROM RUBERIC WHERE R.SCHOOLID = 75 
AND R.TEACHERID = 610 AND R.OBSERVED = 'Observed Classroom' )

【问题讨论】:

标签: mysql sql


【解决方案1】:

BETWEEN 包括端点。大概,您想排除它们:

SELECT R.*
FROM RUBERIC R  
WHERE R.SCHOOLID = 75 AND
      R.OBSERVED = 'Observed Classroom' AND
      R.DATE > (SELECT MIN(R2.DATE) FROM RUBERIC R2 WHERE R2.SCHOOLID = 75 
AND R2.TEACHERID = 610 AND R2.OBSERVED = 'Observed Classroom'
               ) AND
      R.DATE < (SELECT MAX(R2.DATE) FROM RUBERIC R2 WHERE R2.SCHOOLID = 75 
AND R2.TEACHERID = 610 AND R2.OBSERVED = 'Observed Classroom'
               );

此外,您的查询是 - 无意中 - 一个相关的子查询。表别名R 指的是主查询中的行,而不是子查询。您应该始终定义表别名并始终使用它们,但要正确使用它们。 (注意此版本子查询中的所有R2s。)

总的来说,我强烈反对任何人将BETWEEN 与日期或日期/时间一起使用。在您的情况下这不是问题,但时间分量可能会导致意外结果。

【讨论】:

  • 谢谢,戈登。表别名是有意义的。这删除了 ​​MIN 和 MAX 记录。现在,我正试图让它从 2 个“中间”记录中选择一个。
【解决方案2】:

这是因为BETWEEN 具有包容性。看到这个answer

【讨论】:

    【解决方案3】:

    您的 BETWEEN 条件不会更改结果集的任何内容,因为将包含 MIN 和 MAX。您需要将 BETWEEN 条件拆分为 &lt;&gt; 条件。但为了不重复 SCHOOLID、TEACHERID 和 OBSERVED 的条件,我会先在子查询中选择最小和最大日期,然后将表加入到它。

    SELECT R.*
    FROM (
        SELECT SCHOOLID, TEACHERID, OBSERVED, MIN(DATE) AS MIN_DATE, MAX(DATE) AS MAX_DATE
        FROM RUBERIC
        WHERE SCHOOLID  = 75 
          AND TEACHERID = 610 
          AND OBSERVED  = 'Observed Classroom'
    ) X
    JOIN RUBERIC R
      ON  R.SCHOOLID  = X.SCHOOLID
      AND R.TEACHERID = X.TEACHERID
      AND R.OBSERVED  = X.OBSERVED
      AND R.DATE      > X.MIN_DATE
      AND R.DATE      < X.MAX_DATE
    

    如果您需要选择“任何”行之一,只需在查询末尾添加LIMIT 1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-09
      相关资源
      最近更新 更多