1

編集:私は画面を見つめすぎていて、実際には必要な4時(16)ではなく6時(18)を下に置いていることに気づきました。18に一致する行が1つありました。そのため、返される行は1つだけでした。技術的には、コードを16に変更するとコードは機能しますが、@ Gordon Linoffの答えは、JOINを使用するとはるかに高速になります。私のステートメントは戻るのに0.33秒かかり、Gordonのステートメントは0.0003かかります。

2つの日時列と日付列で行を一致させようとしている3つのテーブルがあります。現在の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 これは、ステートメントから期待されるものです。一致する行とスタンプがあるすべての行を表示したい。両方からの2つのタイムスタンプは、時刻が18:00(午後4時)である行のみである必要があります。を比較するときは分や秒は気にしないので、それらがマッチングに影響を与えることはないはずです。datedatetimepuyforecasttacforecastdatetimes

次のようなエントリが表示されるはずです。

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、現在の日付まで日付の照合が行われます。2つ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 に答える