编辑:我一直盯着屏幕太长时间,并意识到我实际上放下了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
这是我对该声明的期望。我希望看到所有行具有匹配的date
和datetime
标记。来自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
列的回溯时间长。
我一直在尝试一些搜索,但我似乎无法找到我正在搜索的内容。
答案 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
列上),它可能更有效。当然可能更糟糕,测试它!