【问题标题】:SQL query returning incorrect valueSQL 查询返回不正确的值
【发布时间】:2021-07-28 12:36:43
【问题描述】:

我有一个 MariaDB 天气数据库,它每 15 分钟根据当前情况更新一次。我正在尝试查询它以返回特定月份的最高温度。 当我使用“从表中选择临时,日期时间”查询它时,我会得到所有临时和记录时间的列表。我可能会在一个小时左右的时间内以 15 分钟的时间间隔获得 3-4 条相同温度的记录。 为了得到一个特定的月份,我尝试了“SELECT temp,logdatetime FROM Monthly WHERE logdatetime like '2020-01%' ORDER BY temp desc”我得到了我的期望。 (日期时间格式为 YYYY-MM-DD HH:mm:ss)

temp logDateTime
40.2 2020-01-04 16:15:00
40.1 2020-01-04 15:30:00
40.1 2020-01-04 17:00:00
40.1 2020-01-04 17:30:00
40.1 2020-01-31 16:15:00
40.0 2020-01-04 16:45:00
40.0 2020-01-31 16:00:00

如果我尝试“SELECT max(temp),logdatetime FROM Monthly WHERE logdatetime like '2020-01%'”,结果是;

temp logdatetime
40.2 2020-01-01 00:00:00

在此示例中,日期错误地返回为 1 月 1 日而不是 1 月 4 日,并且缺少时间。 40.2 只有一个条目,所以它不应该返回时间。我了解如果有多个临时文件,至于 40.1,返回四个日期可能会出现问题。

我还尝试了如下的嵌套选择语句,结果相同。 SELECT max(a.temp), LogDateTime FROM (SELECT temp, logdatetime FROM Monthly WHERE logdatetime like '2020-01%') AS a

非常感谢任何帮助。 彼得

【问题讨论】:

  • WHERE logdatetime like '2020-01%' 永远不要这样做。使用WHERE logdatetime BETWEEN '2020-01-01 00:00:00' AND '2020-01-31 23:59:59'
  • 如果我尝试 "SELECT max(temp),logdatetime FROM Monthly WHERE logdatetime like '2020-01%'" 那么你就犯了一个逻辑错误。

标签: mysql datetime mariadb


【解决方案1】:

使用

SELECT *
FROM logdatetime 
WHERE logdatetime BETWEEN '2020-01-01 00:00:00' AND '2020-01-31 23:59:59'
ORDER BY temp DESC
LIMIT 1

此查询选择 2020 年 1 月温度最高的行。

如果存在许多具有相同最高温度值的行,则此查询将返回其中之一(通常您无法预测将返回所有可能行中的哪一行)。如果你需要一些明确的(例如,最末的),那么你可以扩展排序表达式(例如,直到ORDER BY temp DESC, logdatetime DESC)。

如果您需要所有具有最高温度的行,那么您必须首先在子查询中获取该最大值,然后在查询中使用它进行行过滤。或者,在 MySQL 8+ 版本中,您可以在 CTE 中使用 RANK() 函数。

【讨论】:

    【解决方案2】:

    秋名, 那效果很好。非常感谢您的帮助。 彼得

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      • 2014-09-08
      • 1970-01-01
      相关资源
      最近更新 更多