在我的测试页面上,我有 2 个引导日期时间选择器。 当用户选择开始日期/时间和结束日期/时间并按下按钮时,屏幕将被来自 SQL 数据库的数据填充。 但我很难从正确的时间读取数据,日期没问题。
我的代码是这样的:
$date=$_POST['q'];
$date=explode(' ',$date);
echo "Date".': '.$date[0]."<br/>";
echo "Time".': '.$date[1]."<br/>";
$date1=$_POST['q1'];
$date1=explode(' ',$date1);
echo "Date".': '.$date1[0]."<br/>";
echo "Time".': '.$date1[1]."<br/>";
$a1 = $_POST['a1'];
$q = $date[0];
$q1 = $date1[0];
$q2 = $date[1];
$q3 = $date1[1];
$query = mysqli_query($conn,"SELECT *
FROM `metingen`
WHERE (Datum >= '$q' AND Datum <= '$q1')
and (Tijd >= '$q2' AND Tijd <= '$q3')
ORDER BY Id DESC");
它不漂亮,但没有 tijd(time) 它工作得很好,有 tijd(time) 我错过了数据。
我分割的日期和时间,如你所见,因为我要使用的数据库不是我制作的,所以日期是一个单独的列,时间也是一个单独的列,两者都是文本。
如果我回显爆炸日期/时间,请参阅:
Date: 15-02-2019
Time: 01:00:32
Date: 16-02-2019
Time: 22:55:33
但是我得到的数据是从2019年2月15日00:30:56到2019年2月15日22:11:08
我没有看到所有的日期,我错过了 16 日的日期,但我得到了开始时间之前的日期。
我认为我的 sql 规则有问题,但是我不知道是什么。 有人可以帮我吗?
这是我的表的创建和插入代码(我稍微缩短了它):
CREATE TABLE `metingen` (
`Id` int(11) NOT NULL,
`Datum` varchar(255) DEFAULT NULL,
`Tijd` varchar(255) DEFAULT NULL,
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
--
-- Gegevens worden geëxporteerd voor tabel `metingen`
--
INSERT INTO `metingen` (`Id`, `Datum`, `Tijd`) VALUES
(1, '17-1-2019', '10:31:39'),
(4, '18-1-2019', '10:30:01'),
(40, '28-1-2019', '23:59:42'),
(41, '28-1-2019', '00:50:12'),
(42, '29-1-2019', '02:00:42'),
(49, '29-1-2019', '06:22:53'),
(56, '5-2-2019', '19:35:02'),
(236, '13-2-2019', '13:58:43')
ALTER TABLE `metingen`
ADD KEY `Id` (`Id`);
ALTER TABLE `metingen`
MODIFY `Id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=319;
最佳答案
您不应将日期和时间作为单独的字段存储在数据库中。你应该将它们组合成一个 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
另一个问题是您注入(inject)发布到页面的字符串,因此它们是用户驱动的。这代表SQL Injection vulnerabilty 。相反,您应该使用 prepared statements并将日期时间字符串作为参数传递。
关于php - 如何修复mysql从till到日期和时间的读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54721775/