我有一个带有三个颜色的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()时间,但仍然无法让它工作。有没有一种方法可以在语句中用单引号传递时间,或者我做了别的错误,这应该允许我在没有它们的情况下进行选择。甚至可能是一种更有效的方式?
我对数据库比较陌生,我花了好几个小时玩它。最有可能是一个简单的答案。我只是没有它...任何指针将不胜感激。
答案 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类型制作带有小时和分钟的两列,然后您可以启动选择。