所以我想知道我是否遇到了一个应该或多或少显而易见的问题。
因此,假设我们有一个名为 dateField
的数据库字段,它是日期时间。我们还假设表中的所有记录都有以下值:2013-10-15 13:15:46
。
现在我们想提取日期范围内的记录。我们在网站前端使用2013-10-15(yyyy-mm-dd
)格式。(不,SQL注入是不可能的。它通过PDO。:D)
我们还假设 select 的 where 语句是这样插入的:$select->where('dateField>= ?', $dateFrom);$select->where('dateField <= ?', $dateTo);
因此,当我们有这样的范围时:
由: 2013-10-10至: 2013-10-16 一切正常。
但是用这样的表达方式:由: 2013-10-15 至: 2013-10-15 它没有显示结果!:D
我猜 MySQL 在内部将我的日期类型 2013-10-15 转换为 2013-10-15 00:00:00,我的 WHERE 子句变为:
SELECT .... WHERE dateField <= 2013-10-15 00:00:00 AND dateField >= 2013-10-15 00:00:00;
当然,在这种情况下,2013-10-15 13:15:46 不在我的 WHERE 子句中。 :D :D
我已经通过仅比较以下日期部分来解决此问题:
$select->where('DATE(dateField) >= ?', $dateFrom);
$select->where('DATE(dateField) <= ?', $dateTo);
但我的问题是:
谁能解释更多关于MySQL内部日期/日期时间转换(低级操作)的信息?
这个问题有资格作为社区维基的一个很好的补充吗?
如果未设置时间部分,则将此类 DATE 转换为 DATETIME/TIMESTAMP 将导致将其时间部分填充为 00:00:00
- 这是一种正常行为(如此处所述)。
要使其正常工作 - 您需要指定您的时间部分明确2013-10-15 00:00:00
直到2013-10-15 23:59:59