2013-02-19 39 views
1

编辑:我一直盯着屏幕太长,意识到我实际上放下了6点(18)而不是4点(16)像我需要的。我有一行匹配18,这就是为什么只有一行不断返回。从技术上讲,如果我将其更改为16,我的代码就可以工作,但@Gordon Linoff的答案比JOIN快得多。我的发言需要0.33秒才能返回,而戈登的发言需要0.0003秒。什么SQL语句将返回匹配日期和日期时间的行?

我有三个表,我想通过两个日期时间列和日期列来匹配行。我现在的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列的时间要长。

我一直在尝试一些搜索,但我似乎无法找到它正在寻找什么。

+0

你应该试图通过一个适当的连接来实现这一点(语法从1996年开始!) – Bohemian 2013-02-19 23:32:24

+0

@Bohemian现在我看起来像一个SQL新手。 :)我在SO上发布了另一个SQL问题,胜利的答案是JOIN。我想这就是我可以重新开始搜索的地方。 – qmoog 2013-02-20 00:22:15

回答

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 
+0

该声明提出了与我的原始SQL语句相同的第一个结果。 – qmoog 2013-02-20 00:19:13

+0

我一定是盯着屏幕太久了,因为我写了“下午4点”,但实际上放下了6点。我确实有一个6点钟可以匹配的实例,因此只有一行返回。我将你的例子改为16而不是18,并且它运行得很完美。 – qmoog 2013-02-20 00:31:51

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列),它可能是更有效的。当然,它可能会更糟,测试它!

+0

谢谢你的提示。当我回到服务器上时,我会明天尝试一下。 – qmoog 2013-02-20 02:52:30

+0

有趣。你的查询只比我的原始数据慢0.4秒。你认为这是因为AND线? – qmoog 2013-02-20 15:29:28

+0

'timestamp'列上有索引吗?桌子有多大? – 2013-02-20 15:32:10