php - MySQL 通过截断小时、分钟和秒来按时间戳进行过滤

标签 php mysql sql

我已连接日期时间选择器客户端以根据日期范围过滤结果,但我无法选择日期选择器日期来包含服务器上的日期。例如,如果我选择 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/

相关文章:

javascript - 如何在pentaho中将外部javascript变量作为sql参数传递?

mysql - 拆分表以将经常访问的数据与很少访问的数据分开是否有意义?

PHP 在表中列出 SQL 数据库中的用户

mysql - 在 azure 中使用 java 函数应用程序获取 SSL 和连接错误

MySQL:从逗号分隔的列表/列表中选择作为表? "SELECT a FROM (1, 2, 3)"

php - 如何确定特定资源是否有数据

php - Laravel 5.2 在 Blade 中使用变量的正确方法

php - Magento 从没有 ?SID= 的 ID 中获取类别 url

php - 使用单连接查询从第二个表中获取所有行数据

php - 将列合并为一个结果