简体   繁体   English

MySQL如何在最大和最小之间选择一个日期记录

[英]MySQL How to select a date record between the min and max

Say I have four dates, for example: 假设我有四个约会,例如:

  • 1/1/2018 1/1/2018
  • 2/5/2018 2/5/2018
  • 4/8/2018 4/8/2018
  • 9/9/2018 9/9/2018

I want to 'select' a date in between the min and max. 我想在最大和最小之间选择一个日期。 Either the 2/5/2018 record or the 4/8/2018 record ONLY. 仅2/5/2018记录或4/8/2018记录。

I think I'm close, but this query returns ALL the rows: 我想我已经关闭了,但是此查询返回所有行:

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

BETWEEN includes the end points. BETWEEN包括端点。 Presumably, you want to exclude them: 大概,您想排除它们:

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'
               );

Also, your query is -- inadvertently -- a correlated subquery. 同样,您的查询是(无意中)相关的子查询。 The table alias R refers to the rows in the main query, not the subquery. 表别名R引用主查询中的行,而不是子查询中的行。 You should always define table aliases and always use them, but use them properly. 您应该始终定义表别名并始终使用它们,但要正确使用它们。 (Note all the R2 s in the subqueries in this version.) (请注意此版本中子查询中的所有R2 。)

In general, I strongly discourage anyone from using BETWEEN with date or date/times. 通常,我强烈不鼓励任何人将BETWEEN与日期或日期/时间一起使用。 This is not a problem in your case, but the time component can lead to unexpected results. 在您的情况下,这不是问题,但是时间部分可能会导致意外结果。

This is due to the fact that BETWEEN is inclusive. 这是由于BETWEEN具有包容性。 See this answer . 看到这个答案

Your BETWEEN condtition doesn't change anything on the result set, since MIN and MAX will be included. 您的BETWEEN状态不会改变结果集,因为会包含MIN和MAX。 You need to split the BETWEEN condition into < and > conditions. 您需要将BETWEEN条件分为<>条件。 But in order to not duplicate the conditions on SCHOOLID, TEACHERID and OBSERVED, I would first select the min and max date in a subquery and then join the table to it. 但是,为了不重复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

If you need to select "any" one of the rows, just add LIMIT 1 at the end of the query. 如果您需要选择任一行,只需在查询末尾添加LIMIT 1

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM