什么SQL语句将返回具有匹配日期和日期时间的行?

时间:2013-02-19 23:27:28

标签: mysql sql innodb

编辑:我一直盯着屏幕太长时间,并意识到我实际上放下了6点钟(18点)而不是4点钟(16点),就像我需要的那样。我有一行与18匹配,这就是为什么只有一行不断返回。从技术上讲,如果我将代码更改为16,我的代码就可以工作,但@Jordon Linoff对JOIN的回答要快得多。我的陈述需要0.33秒才能返回,戈登需要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标记。来自puyforecasttacforecast的两个时间戳应仅为时间为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列的回溯时间长。

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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列上),它可能更有效。当然可能更糟糕,测试它!