2015-08-14 27 views
3

我正在尝试编写查询以获取日期大于11个月或小于12个月的所有数据。我已经尝试了下面的查询,以天返回日期差异。有几个月我可以检查吗?Mysql。以月为单位的日期差异

$qb ->select("pj,DATE_DIFF(CURRENT_TIME(), pj.date) as dt) 
    ->from("PrevJbs", "pj"); 

回答

2

有Mysql的功能PERIOD_DIFF

能做到这一点更容易,但它的运作期全

$qb ->select(" 
     pj, 
     PERIOD_DIFF(DATE_FORMAT(CURRENT_TIME(), '%Y%m'), DATE_FORMAT(pj.date, '%Y%m')) AS dt 
    ") 
    ->from("PrevJbs", "pj"); 
2

这很容易以天计算。

但在几个月......我们可以有30,31,28 ......

Mysql的(我知道)有没有功能个月来计算差异。

所以我们应该使用https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_month自己做。

另外我们应该记住,年份可以不同,我们将使用https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_year

让我们试着...

$qb ->select(" 
     pj, 
     ((YEAR(CURRENT_TIME()) - YEAR(pj.date)) * 12 + 
      IF ((MONTH(CURRENT_TIME()) >= MONTH(pj.date)) 
       MONTH(CURRENT_TIME()) - MONTH(pj.date), 
       MONTH(CURRENT_TIME()) + 12 - MONTH(pj.date) 
      ) 
     ) as dt 
    ") 
    ->from("PrevJbs", "pj"); 
1

我是正确的思维,你只想列出12至11个月之间的所有项目?

使用DQL你可以使用..

return $qb 
    ->select('pj') 

    ->where($qb->expr()->lt('pj.date', ':lessThan')) 
    ->setParameter('lessThan', new \DateTime('- 12 months')) 

    ->orWhere($qb->expr()->gt('pj.date', ':greaterThan')) 
    ->setParameter('greaterThan', new \DateTime('- 11 months')) 

    ->getQuery() 
    ->getResult();