使用相对日期创建MYSQL查询

时间:2018-08-18 00:37:54

标签: mysql sql

我有一个每月更新的mysql查询,并且希望有一个自动更新的查询。 当前查询是:

SELECT SUM((pm.meta_value = '0' AND p.post_status = 'wc-active') or pm.meta_value > '2018-10-01 23:59:59') AS SEPTEMBER,
       SUM((pm.meta_value = '0' AND p.post_status = 'wc-active') or pm.meta_value > '2018-10-01 23:59:59') AS OCTOBER,
       SUM((pm.meta_value = '0' AND p.post_status = 'wc-active') or pm.meta_value > '2018-11-01 23:59:59') AS NOVEMBER
FROM simp_posts p INNER JOIN
     simp_postmeta pm
     ON p.ID = pm.post_id
WHERE pm.meta_key = '_schedule_end' AND
      p.post_status IN ('wc-active', 'wc-pending-cancel')

该查询的结果如下:

September    October    November 
242          227         214  

每个月我都会更改“ pm.meta_value>”和AS之后的日期。 我想要的是用:

替换此硬编码的日期
first day of next month (+1) at 23:59:59 AS MMMM (next month in all letters)
first day of next month (+2) at 23:59:59 AS MMMM (next month in all letters)
first day of next month (+3) at 23:59:59 AS MMMM (next month in all letters)

有可能吗?

谢谢,我希望我已经清楚了。

1 个答案:

答案 0 :(得分:2)

好,所以我没有尝试过,但是我相信它应该可以工作

SET @firstMonthDate = DATE_ADD(LAST_DAY(NOW()), INTERVAL 2 DAY);
SET @firstMonthName = UPPER(DATE_FORMAT(@firstMonthDate, '%M'));

SET @secondMonthDate = DATE_ADD(LAST_DAY(DATE_ADD(NOW(), INTERVAL 1 MONTH)), INTERVAL 2 DAY);
SET @secondMonthName = UPPER(DATE_FORMAT(@secondMonthDate, '%M'));

SET @thirdMonthDate = DATE_ADD(LAST_DAY(DATE_ADD(NOW(), INTERVAL 2 MONTH)), INTERVAL 2 DAY);
SET @thirdMonthName = UPPER(DATE_FORMAT(@thirdMonthDate, '%M'));

SET @query = concat("SELECT SUM((pm.meta_value = '0' AND p.post_status = 'wc-active') or pm.meta_value >= ",@firstMonthDate,") AS ",@firstMonthName,",
       SUM((pm.meta_value = '0' AND p.post_status = 'wc-active') or pm.meta_value >= ",@secondMonthDate,") AS ",@secondMonthName,",
       SUM((pm.meta_value = '0' AND p.post_status = 'wc-active') or pm.meta_value >= ",@thirdMonthDate,") AS ",@thirdMonthName,"
FROM simp_posts p INNER JOIN
     simp_postmeta pm
     ON p.ID = pm.post_id
WHERE pm.meta_key = '_schedule_end' AND
      p.post_status IN ('wc-active', 'wc-pending-cancel')");

PREPARE stmt FROM @query;
EXECUTE stmt;

因此,我们将接下来三个月的名称和日期转换为变量,然后从中创建查询字符串,然后执行stmt。

我更改了您与23:59:59> date进行比较的部分,但是我认为它应该仍然可以正常工作。 如果出现任何错误,我认为应该是与缺少引号有关的内容或应该调试的东西。

希望它能起作用。 让我知道结果。