1

编辑:我一直盯着屏幕太久,意识到我实际上放下了 6 点钟 (18) 而不是 4 点钟 (16) ,就像我需要的那样。我有一排与 18 匹配,这就是为什么只有一排不断被退回的原因。从技术上讲,如果我将代码更改为 16,我的代码就可以工作,但是@Gordon Linoff 的答案使用 JOIN 会快得多。我的语句需要 0.33 秒才能返回,而 Gordon 需要 0.0003 秒。

我有三个表,我试图通过两个日期时间列和一个日期列来匹配行。我当前的 SQL 命令如下所示:

SELECT puyforecast.timestamp, tacforecast.timestamp, date
FROM puyforecast, tacforecast, stnrain
WHERE puyforecast.timestamp LIKE CONCAT(date, ' 18:%')
AND tacforecast.timestamp LIKE CONCAT(date, ' 18:%');

这只会拉出第一个匹配的行: 2013-01-28 18:37:33, 2013-01-28 18:37:34, 2013-01-28 这是我对语句的期望。我想查看所有具有匹配datedatetime标记的行。puyforecast两者中的两个时间戳tacforecast应该只是时间为 18:00(下午 4 点)的行。比较时我不在乎分钟或秒datetimes,所以这些不应该对匹配产生影响。

我应该看到这样的条目:

2013-01-28 18:37:33,    2013-01-28 18:37:34,    2013-01-28
2013-01-29 18:00:02,    2013-01-29 18:00:34,    2013-01-29
2013-01-30 18:00:02,    2013-01-30 18:00:34,    2013-01-30
...

和 &c,日期匹配一直持续到当前日期。这两datetime列在时间上比列更远date

我一直在尝试一些搜索,但我似乎无法找到我正在搜索的内容。

4

2 回答 2

2

你能在约会时匹配这些吗?

SELECT pf.timestamp, tf.timestamp, date
FROM stnrain s join
     puyforecast pf
     on date(pf.timestamp) = s.date and
        hour(pf.timestamp) = 18 join
     tacforecast tf
     on date(tf.timestamp) = s.date and
        hour(tf.timestamp) = 18
于 2013-02-19T23:54:48.707 回答
0

性能的提高不是因为您将查询转换为使用JOIN语法,可能是因为您摆脱了LIKE条件。日期和日期时间列不应与 比较LIKE,即用于字符串比较。

您还可以像这样重写您的查询:

SELECT p.timestamp AS p_timestamp,
       t.timestamp AS t_timestamp, 
       s.date
FROM stnrain AS s
  JOIN puyforecast AS p
    ON  p.timestamp >= s.date + INTERVAL 18 HOUR 
    AND p.timestamp <  s.date + INTERVAL 19 HOUR
  JOIN tacforecast AS t
    ON  t.timestamp >= s.date + INTERVAL 18 HOUR 
    AND t.timestamp <  s.date + INTERVAL 19 HOUR ;

这可能会使用不同的索引(在timestamp列上),并且可能更有效。当然可能会更糟,测试一下!

于 2013-02-20T00:51:44.867 回答