1

私は Idiorm をいじっていましたが、データベースから今日と昨日のすべてのレコードを取得できませんでした。したがって、MySQL クエリは次のとおりです。

SELECT * FROM `video` WHERE DATE(`time_stamp`) = CURDATE()    # today
SELECT * FROM `video` WHERE DATE(`time_stamp`) = CURDATE() -1 # yesterday

私の理解が正しければ、それはイディオムで正確に再現することはできませんよね? 次のオプションも試しましたが、奇妙に機能しませんでした (空の配列を返します)。

$today = ORM::for_table('video')->
        where_lt('time_stamp', 'CURDATE()')->
        where_gte('time_stamp', 'CURDATE()-1')->find_many();

それをどのように行うべきかについて私を修正してもらえますか?

4

1 に答える 1

0

列の値に対して関数を使用するものを避けることが、MySQL のパフォーマンスにとって最善です。例えば、

WHERE DATE(time_stamp) = CURDATE()   /* slow! */

time_stamp でレコードを検索するためのインデックスの使用を完全に無効にします。これにより、完全なテーブル スキャンが発生します。これは正しく機能しますが、時間がかかります。必要なのは、インデックス レンジ スキャンを生成する SQL 式です。これは、今日の日付の午前 0 時以降のすべての time_stamp 値に対して行われます。

WHERE time_stamp >= CURDATE()

昨日の time_stamp 値をすべて見つけたい場合は、次の SQL ステートメントが必要です。

WHERE time_stamp >= CURDATE() - INTERVAL 1 DAY
  AND time_stamp <  CURDATE()

つまり、[昨日の午前 0 時、今日の午前 0 時] の範囲内のすべてのタイム スタンプが必要であり、この範囲には今日の午前 0 時は含まれません。

あなたの Idiorm コードのCURDATE() - INTERVAL 1 DAY式が間違っていると思います。CURDATE() - 1Oracle では動作しますが、MySQL では動作しません。

于 2014-01-17T15:50:52.543 に答える