我已连接日期时间选择器客户端以根据日期范围过滤结果,但我无法选择日期选择器日期来包含服务器上的日期。例如,如果我选择 dateTo 为 2014 年 11 月 6 日,结果将不包括该记录,但如果我选择 2014 年 11 月 7 日,它将包括 2014 年 11 月 6 日。我确信这与 unixtimestamp 有关服务器包括 H:M:S,但我不知道如何截断它们。我尝试使用 DATE_FORMAT 甚至 FROM_UNIXTIME 使用 '%M %d, %Y',但是返回的范围都不正确,这似乎是迄今为止最接近的。
PHP 将 2014 年 11 月 6 日(或同等日期)转换为时间戳并附加到 SQL 查询:
if( !empty($query_filters['dateFrom']) && !empty($query_filters['dateTo']) )
{
$sql .= " AND UNIX_TIMESTAMP(packageinstance.created)
BETWEEN " . strtotime($query_filters['dateFrom']) . "
AND " . strtotime($query_filters['dateTo']);
}
else if( !empty($query_filters['dateFrom']) && empty($query_filters['dateTo']) )
{
$sql .= " AND UNIX_TIMESTAMP(packageinstance.created) >= " . strtotime($query_filters['dateFrom']);
}
else if( !empty($query_filters['dateTo']) && empty($query_filters['dateFrom']) )
{
$sql .= " AND UNIX_TIMESTAMP(packageinstance.created) <= " . strtotime($query_filters['dateTo']);
}
生成的 SQL
SELECT SQL_CALC_FOUND_ROWS
packageinstance.id,
UNIX_TIMESTAMP(packageinstance.created) as epoch_time,
user.username,
status.name as status,
package.type
FROM packageinstance
JOIN user ON user.id = packageinstance.creatorid
JOIN status ON status.id = packageinstance.status
JOIN package ON package.id = packageinstance.packageid
WHERE packageinstance.locationid = 1
AND status LIKE '%%'
AND UNIX_TIMESTAMP(packageinstance.created) < 1415228400
ORDER BY epoch_time DESC LIMIT 5 OFFSET 0
我需要做什么来截断来自 packageinstance.created 的 SQL 查询中的时间?
更新
使用下面的 @alu 答案进行 PHP 日期格式化,然后添加 DATE_FORMAT 这似乎有效,但是相当冗长,这是多余的吗?没有单独使用 @alu 答案,但它很有帮助。
if( !empty($query_filters['dateFrom']) && !empty($query_filters['dateTo']) )
{
$sql .= " AND DATE_FORMAT(packageinstance.created, '%Y-%m-%d')
BETWEEN DATE_FORMAT('" . date('Y-m-d 00:00:00', strtotime($query_filters['dateFrom'])) . "', '%Y-%m-%d')
AND DATE_FORMAT('" . date('Y-m-d 00:00:00', strtotime($query_filters['dateTo'])) . "', '%Y-%m-%d')";
}
else if( !empty($query_filters['dateFrom']) && empty($query_filters['dateTo']) )
{
$sql .= " AND DATE_FORMAT(packageinstance.created, '%Y-%m-%d') >=
DATE_FORMAT('" . date('Y-m-d 00:00:00', strtotime($query_filters['dateFrom'])) . "', '%Y-%m-%d')";
}
else if( !empty($query_filters['dateTo']) && empty($query_filters['dateFrom']) )
{
$sql .= " AND DATE_FORMAT(packageinstance.created, '%Y-%m-%d') <=
DATE_FORMAT('" . date('Y-m-d 00:00:00', strtotime($query_filters['dateTo'])) . "', '%Y-%m-%d')";
}
生成的 SQL
SELECT SQL_CALC_FOUND_ROWS
packageinstance.id,
UNIX_TIMESTAMP(packageinstance.created) as epoch_time,
user.username,
status.name as status,
package.type
FROM packageinstance
JOIN user ON user.id = packageinstance.creatorid
JOIN status ON status.id = packageinstance.status
JOIN package ON package.id = packageinstance.packageid
WHERE packageinstance.locationid = ? AND status LIKE '%%'
AND DATE_FORMAT(packageinstance.created, '%Y-%m-%d') <= DATE_FORMAT('2014-11-06 00:00:00', '%Y-%m-%d')
ORDER BY epoch_time desc LIMIT 5 OFFSET 0
最佳答案
试试这个。
$sql .= " AND packageinstance.created >= '" . date('Y-m-d 00:00:00', strtotime($query_filters['dateFrom'])) . "'";
关于php - MySQL 通过截断小时、分钟和秒来按时间戳进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26855183/