SQL请求在过去30天内获得数据

时间:2019-08-05 08:17:11

标签: mysql sql

我依靠一个请求,我阻止在30天后添加约束。我可以恢复去年订单的销售,但我想再加上30天。

这是我的要求:

SELECT SUM(total_paid)/COUNT(id_order)
        FROM ps_orders o
        WHERE o.date_add BETWEEN DATE_FORMAT(
        CASE
            WHEN YEAR( DATE_SUB( now(), INTERVAL 364 DAY ) ) = YEAR(now() )
            THEN DATE_SUB(concat(YEAR(now()),'-',MONTH(now()),'-01'), INTERVAL 371 DAY)
            ELSE DATE_SUB(concat(YEAR(now()),'-',MONTH(now()),'-01'), INTERVAL 364 DAY) END, '%Y/%m/%d') AND
        CASE
            WHEN YEAR( DATE_SUB( now(), INTERVAL 364 DAY ) ) = YEAR(now() )
            THEN DATE_SUB(now(), INTERVAL 371 DAY)
            ELSE DATE_SUB(now(), INTERVAL 364 DAY) END
        AND valid=1

30天

SELECT SUM(total_paid)/COUNT(id_order)
        FROM '._DB_PREFIX_.'orders o
        WHERE o.date_add BETWEEN DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 MONTH), "%Y/%m/%d") AND NOW()
        AND o.valid=1

必须按照total_paidid_order的营业额退还给我。

turnover

谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我认为根据今天的日期,您可能希望从去年开始连续30天。您可以使用此函数使用date_sub两次,以获取下边界。例如,我有一个名为date的表,其中包含2000年以来的所有日期。

SELECT DTE, date_sub(date_sub(date(now()), interval 1 year), interval 30 day) lastyrplus30,
                date_sub(date(now()), interval 1 year) lastyr
from dates
where dte between date_sub(date_sub(date(now()), interval 1 year), interval 30 day) and
                        date_sub(date(now()), interval 1 year)
;

产生

+------------+--------------+------------+
| DTE        | lastyrplus30 | lastyr     |
+------------+--------------+------------+
| 2018-07-06 | 2018-07-06   | 2018-08-05 |
| 2018-07-07 | 2018-07-06   | 2018-08-05 |
| 2018-07-08 | 2018-07-06   | 2018-08-05 |
| 2018-07-09 | 2018-07-06   | 2018-08-05 |
| 2018-07-10 | 2018-07-06   | 2018-08-05 |
| 2018-07-11 | 2018-07-06   | 2018-08-05 |
| 2018-07-12 | 2018-07-06   | 2018-08-05 |
| 2018-07-13 | 2018-07-06   | 2018-08-05 |
| 2018-07-14 | 2018-07-06   | 2018-08-05 |
| 2018-07-15 | 2018-07-06   | 2018-08-05 |
| 2018-07-16 | 2018-07-06   | 2018-08-05 |
| 2018-07-17 | 2018-07-06   | 2018-08-05 |
| 2018-07-18 | 2018-07-06   | 2018-08-05 |
| 2018-07-19 | 2018-07-06   | 2018-08-05 |
| 2018-07-20 | 2018-07-06   | 2018-08-05 |
| 2018-07-21 | 2018-07-06   | 2018-08-05 |
| 2018-07-22 | 2018-07-06   | 2018-08-05 |
| 2018-07-23 | 2018-07-06   | 2018-08-05 |
| 2018-07-24 | 2018-07-06   | 2018-08-05 |
| 2018-07-25 | 2018-07-06   | 2018-08-05 |
| 2018-07-26 | 2018-07-06   | 2018-08-05 |
| 2018-07-27 | 2018-07-06   | 2018-08-05 |
| 2018-07-28 | 2018-07-06   | 2018-08-05 |
| 2018-07-29 | 2018-07-06   | 2018-08-05 |
| 2018-07-30 | 2018-07-06   | 2018-08-05 |
| 2018-07-31 | 2018-07-06   | 2018-08-05 |
| 2018-08-01 | 2018-07-06   | 2018-08-05 |
| 2018-08-02 | 2018-07-06   | 2018-08-05 |
| 2018-08-03 | 2018-07-06   | 2018-08-05 |
| 2018-08-04 | 2018-07-06   | 2018-08-05 |
| 2018-08-05 | 2018-07-06   | 2018-08-05 |
+------------+--------------+------------+
31 rows in set (0.01 sec)

如果要进一步测试,并且有日期或日历表之类的内容,则可以用用户定义的变量替换now()。例如

set @now = '2019-05-20';

SELECT DTE, date_sub(date_sub(date(@now), interval 1 year), interval 30 day) lastyrplus30,
                date_sub(date(@now), interval 1 year) lastyr
from dates
where dte between date_sub(date_sub(date(@now), interval 1 year), interval 30 day) and
                        date_sub(date(@now), interval 1 year) ;

结果

+------------+--------------+------------+
| DTE        | lastyrplus30 | lastyr     |
+------------+--------------+------------+
| 2018-04-20 | 2018-04-20   | 2018-05-20 |
| 2018-04-21 | 2018-04-20   | 2018-05-20 |
| 2018-04-22 | 2018-04-20   | 2018-05-20 |
| 2018-04-23 | 2018-04-20   | 2018-05-20 |
| 2018-04-24 | 2018-04-20   | 2018-05-20 |
| 2018-04-25 | 2018-04-20   | 2018-05-20 |
| 2018-04-26 | 2018-04-20   | 2018-05-20 |
| 2018-04-27 | 2018-04-20   | 2018-05-20 |
| 2018-04-28 | 2018-04-20   | 2018-05-20 |
| 2018-04-29 | 2018-04-20   | 2018-05-20 |
| 2018-04-30 | 2018-04-20   | 2018-05-20 |
| 2018-05-01 | 2018-04-20   | 2018-05-20 |
| 2018-05-02 | 2018-04-20   | 2018-05-20 |
| 2018-05-03 | 2018-04-20   | 2018-05-20 |
| 2018-05-04 | 2018-04-20   | 2018-05-20 |
| 2018-05-05 | 2018-04-20   | 2018-05-20 |
| 2018-05-06 | 2018-04-20   | 2018-05-20 |
| 2018-05-07 | 2018-04-20   | 2018-05-20 |
| 2018-05-08 | 2018-04-20   | 2018-05-20 |
| 2018-05-09 | 2018-04-20   | 2018-05-20 |
| 2018-05-10 | 2018-04-20   | 2018-05-20 |
| 2018-05-11 | 2018-04-20   | 2018-05-20 |
| 2018-05-12 | 2018-04-20   | 2018-05-20 |
| 2018-05-13 | 2018-04-20   | 2018-05-20 |
| 2018-05-14 | 2018-04-20   | 2018-05-20 |
| 2018-05-15 | 2018-04-20   | 2018-05-20 |
| 2018-05-16 | 2018-04-20   | 2018-05-20 |
| 2018-05-17 | 2018-04-20   | 2018-05-20 |
| 2018-05-18 | 2018-04-20   | 2018-05-20 |
| 2018-05-19 | 2018-04-20   | 2018-05-20 |
| 2018-05-20 | 2018-04-20   | 2018-05-20 |
+------------+--------------+------------+
31 rows in set (0.02 sec)