1

day、start_time、end_time という 3 つの列を持つ SQLite テーブルがあります。HH:MM の形式で時刻を追加し、時間ストレージに関する SQLite の推奨事項に従って、タイプを TEXT に設定しました。時間を検索しようとすると問題が発生します...

    try {
        $stmt = $dbh->prepare('SELECT * FROM lesson WHERE day = :day AND start_time <= :time AND end_time >= :time');
        $stmt->execute(array('day' => $day, 'time' => $time));
        $result_arr = $stmt->fetch(PDO::FETCH_ASSOC);
        if(empty($result_arr)) {
            return 'No lessons found';
        }
        else {
            return $result_arr;
        }   
    }

以上で、日のみの検索は問題ないのですが、時間になると問題が発生します。以下のステートメントでは、あるべきときに結果が返されませんか?

   SELECT * FROM "lesson" WHERE day = 3 AND start_time <= 10:52 AND end_time >= 10:52

私は直接SQLステートメントをいじってみましたが、結果を返すように選択することしかできませんでした。それは、時間を単一引用符で囲むことでした。

    SELECT * FROM "lesson" WHERE day = 3 AND start_time <= '10:52' AND end_time >= '10:52'

次に、その時間を strval() しようとしましたが、まだ機能しません。ステートメント内で一重引用符を使用して時間を渡す方法はありますか、またはそれらなしで選択できるようにするために何か間違ったことをしていますか? たぶんもっと効率的な方法でしょうか?

私はデータベースに比較的慣れていないので、何時間もデータベースをいじっています。おそらく簡単な答えがあります。私はそれを持っていません...どんなポインタでも大歓迎です。

4

2 に答える 2

0

あなたのアプリケーションでは、タイプ TEXT が間違っています。INTEGER タイプの時間と分の 2 つの列を作成すると、select を起動できます。

于 2013-10-30T07:57:27.107 に答える
0

日時を分けるのは珍しい。単一フィールド (「モーメント」) を使用:

CREATE TABLE lesson(
 ...
 ,moment DATETIME
);

DATETIME 型は SQLite にとっては何の意味もありませんが、開発者にとっては便利です。時刻 (+ 日付) を次の形式の文字列に格納します。

YYYY-MM-DD
YYYY-MM-DD HH:MM
YYYY-MM-DD HH:MM:SS

詳細については、「時間文字列」を参照してください。

そのフィールドにインデックスを作成して、クエリを高速化します。

CREATE INDEX IX_lesson_moment ON lesson(moment)

レコードを選択:

SELECT * FROM lesson WHERE moment >= '2013-10-30' AND moment < '2013-10-31'
SELECT * FROM lesson WHERE moment >= '2013-10-30 10:00' AND moment < '2013-10-30 11:00'

パラメータも使用できます。

SELECT * FROM lesson WHERE moment >= ? AND moment <= ?

時間を文字列値として渡す

于 2013-10-30T07:22:12.643 に答える