mysql查询选择未来45天内的所有日期(仅限日和月)

euoag5mw  于 2021-06-17  发布在  Mysql
关注(0)|答案(3)|浏览(369)

我需要选择所有日期(日和月)在未来45天内(不分年份)。以下查询已停止工作。就像在有数据的情况下开始不返回任何行一样。
是否有其他方法来执行此查询?如果需要,可以在php循环中检查记录。
基本上我需要在接下来的45天内显示所有记录,即使一年过去了。

SELECT
   p.*,
   c.company 
FROM
   products p 
   LEFT JOIN
      customers c 
      ON c.id = p.id 
WHERE
   DATE_FORMAT(p.service_date, '%m-%d') >= DATE_FORMAT(CURDATE(), '%m-%d') 
   AND DATE_FORMAT(p.service_date, '%m-%d') <= DATE_FORMAT((CURDATE() + INTERVAL 45 DAY), '%m-%d') 
   AND c.email_service = 1 
ORDER BY
   p.service_date ASC
holgip5t

holgip5t1#

用php解决了这个问题

// Get the dates m-d for the next 45 days
for ($i = 0; $i <= 45; $i++) {
    $days = '+' . $i . ' days';
    $date = date('m-d', strtotime($days));
    if ($i != 45) {
        $DateQuery .= "'$date',";
    } else {
        $DateQuery .= "'$date'";
    }
}

并将我需要的日期直接插入到查询中

SELECT
       p.*,
       c.company 
    FROM
       products p 
       LEFT JOIN
          customers c 
          ON c.id = p.id 
    WHERE
       DATE_FORMAT(p.service_date, '%m-%d') IN 
       (
           $DateQuery
       )
       AND c.email_service = 1 
    ORDER BY
       p.service_date ASC
wwwo4jvm

wwwo4jvm2#

解决这个问题的最好办法是使用 DAYOFYEAR . 困难的部分是在年底45天内处理案件,在这种情况下,你必须拆分支票,看看日期是现在到年底还是年初到现在+45天;否则,您只需检查一年中的某一天是否介于现在和现在+45天之间。尝试用以下内容替换您的状况:

CASE WHEN DAYOFYEAR('2018-12-31')-DAYOFYEAR(NOW()) < 45 THEN
         DAYOFYEAR(p.service_date) BETWEEN DAYOFYEAR(NOW()) AND DAYOFYEAR('2018-12-31') OR
         DAYOFYEAR(p.service_date) BETWEEN 1 AND DAYOFYEAR(NOW() + INTERVAL 45 DAY)
     ELSE
         DAYOFYEAR(p.service_date) BETWEEN DAYOFYEAR(NOW()) AND DAYOFYEAR(NOW() + INTERVAL 45 DAY)
     END

您的完整查询应如下所示:

SELECT
   p.*,
   c.company 
FROM
   products p 
   LEFT JOIN
      customers c 
      ON c.id = p.id 
WHERE
    (CASE WHEN DAYOFYEAR('2018-12-31')-DAYOFYEAR(NOW()) < 45 THEN
              DAYOFYEAR(p.service_date) BETWEEN DAYOFYEAR(NOW()) AND DAYOFYEAR('2018-12-31') OR
              DAYOFYEAR(p.service_date) BETWEEN 1 AND DAYOFYEAR(NOW() + INTERVAL 45 DAY)
          ELSE
              DAYOFYEAR(p.service_date) BETWEEN DAYOFYEAR(NOW()) AND DAYOFYEAR(NOW() + INTERVAL 45 DAY)
          END)
    AND c.email_service = 1 
ORDER BY
    p.service_date ASC

如果你担心闰年,你可以改变 DAYOFYEAR('2018-12-31')DAYOFYEAR(CONCAT(YEAR(NOW), '-12-31'))

g9icjywg

g9icjywg3#

我不知道为什么你最初的查询 Date_Format() 在柱子上( service_date ),已存储在mysql日期类型中,用于范围比较。它也不能使用任何索引(如果已定义)。
你只需要加/减 Interval 截止日期:

SELECT
   p.*,
   c.company 
FROM
   products p 
   LEFT JOIN
      customers c 
      ON c.id = p.id 
WHERE
   p.service_date >= CURDATE() 
   AND p.service_date <= (CURDATE() + INTERVAL 45 DAY) 
   AND c.email_service = 1 
ORDER BY
   p.service_date ASC

相关问题