1

我有一个 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 * FROM "lesson" WHERE day = 3 AND start_time <= '10:52' AND end_time >= '10:52'

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

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

4

2 回答 2

0

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

于 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 回答