2013-02-19 50 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

相關問題