SQLite和时间搜索问题

时间:2013-10-30 00:57:25

标签: sql sqlite

我有一个带有三个颜色的SQLite表,名为day,start_time和end_time。我已经以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返回任何结果是用单引号封装时间。

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

然后我尝试strval()时间,但仍然无法让它工作。有没有一种方法可以在语句中用单引号传递时间,或者我做了别的错误,这应该允许我在没有它们的情况下进行选择。甚至可能是一种更有效的方式?

我对数据库比较陌生,我花了好几个小时玩它。最有可能是一个简单的答案。我只是没有它...任何指针将不胜感激。

2 个答案:

答案 0 :(得分:0)

分开日期和时间是不寻常的。使用单个字段(“时刻”):

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

DATETIME类型对SQLite没有任何意义,但对开发人员有用。将时间(+日期)存储在遵循以下格式的字符串中:

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

阅读更多here,“时间字符串”。

在该字段上创建索引以加快查询速度:

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 <= ?

并将时间作为字符串值

传递

答案 1 :(得分:0)

对于您的应用程序,TEXT类型错误。使用INTEGER类型制作带有小时和分钟的两列,然后您可以启动选择。