不应将日期和时间作为单独的字段存储在数据库中。你应该把它们组合成一个
datetime
数据库中的字段。然后,您应该在
supported literal formats
YYYY-MM-DD H:m:s
现在回到你原来的处境。问题是,当表的日期严格地介于两个极端日期之间(不等于两个极端日期中的任何一个)时,还需要时间条件。在这种情况下,时间部分应该没有限制:在这样的日子里,所有的时间都是可以的。
下面是SQL的外观:
SELECT *
FROM metingen
WHERE ( Datum > '$q' OR ( Datum = '$q' AND Tijd >= '$q2' ) )
AND ( Datum < '$q1' OR ( Datum = '$q1' AND Tijd <= '$q3' ) )
ORDER BY Id DESC
但同样,这不是最佳做法。
varchar
(不是
date
D-M-YYYY
格式,而您的输入是
DD-MM-YYYY
SELECT *
FROM metingen
WHERE ( STR_TO_DATE(Datum, '%d-%m-%Y') > STR_TO_DATE('$q', '%d-%m-%Y')
OR ( STR_TO_DATE(Datum, '%d-%m-%Y') = STR_TO_DATE('$q', '%d-%m-%Y')
AND Tijd >= '$q2' ) )
AND ( STR_TO_DATE(Datum, '%d-%m-%Y') < STR_TO_DATE('$q1', '%d-%m-%Y')
OR ( STR_TO_DATE(Datum, '%d-%m-%Y') = STR_TO_DATE('$q1', '%d-%m-%Y')
AND Tijd <= '$q3' ) )
ORDER BY Id DESC
另一个问题是,您插入发布到页面的字符串,因此它们是用户驱动的。这表示
SQL Injection vulnerabilty
. 相反,你应该使用
prepared statements
并将日期时间字符串作为参数传递。