簡體   English   中英

MySQL通過時間戳截斷小時,分鍾和秒來過濾

[英]MySQL filtering by timestamp by truncating hours, minutes and seconds

我已經連接了一個datetimepicker客戶端,以根據日期范圍過濾結果,但是我無法獲得選擇的日期選擇器日期以包括服務器上的日期。 因此,例如,如果我選擇dateTo為2014年11月6日,則結果將不包括該記錄,但是如果我選擇2014年11月7日,則結果將包括2014年11月6日。我確定這與unixtimestamp有關該服務器包括H:M:S,但我不知道如何截斷它們。 我嘗試使用DATE_FORMAT甚至使用'%M%d,%Y'的FROM_UNIXTIME,但是返回的范圍都不正確,這似乎是迄今為止最接近的范圍。

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查詢中的時間?

UPDATE

使用下面的@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'])) . "'";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM