MySQL如何获得日期间隔为17个月的查询,显示当前月份加上5个月之前的日期

bihw5rsg  于 2022-11-28  发布在  Mysql
关注(0)|答案(2)|浏览(147)

我是一个SQL新手,我对一个我觉得很复杂的查询有问题。
因此,我尝试创建一个显示17个月日期间隔的查询。在该间隔内,它必须显示当前月份和当前日期。然后,它必须将该日期与当前日期之前的月份进行比较。
然后,我将使用Highcharts图表中的数据。
这是当前查询和表的外观。

SELECT
    MONTH(s_order_main.added_date)                  AS iMonth,
    s_order_main.channel                            AS strChannel,
    COUNT(DISTINCT s_order_styles.s_order_style_id) AS iOrderCount,
    SUM(DISTINCT s_order_styles.sales_price)        AS fTurnover
FROM
    s_order_main
INNER JOIN
    s_order_styles ON
        s_order_styles.s_order_main_id = s_order_main.id
WHERE
    s_order_main.channel
    && s_order_main.order_type = 'pre'
    && YEAR(s_order_main.added_date) = YEAR(CURDATE() - INTERVAL 17 MONTH)
GROUP BY
    MONTH(s_order_main.added_date)
;

| 每月|字符串通道|iOrder计数|f营业额|
| - -|- -|- -|- -|
| 一个|正常的|小行星2234|小行星33048.66|
| 2个|正常的|小行星6638|小行星66711.96|
| 三个|正常的|小行星4266|小行星30742.70|
| 四个|正常的|一百七十一|七百六十六点一零|
| 五个|正常的|九十|九百二十六点五五|
| 六个|正常的|小行星1254|小行星12334.04|
| 七个|正常的|九二一|小行星2990.35|
| 八个|正常的|小行星946|小行星46407.63|
| 九个|正常的|小行星5837|小行星31623.17|
| 10个|正常的|七十|三百零五点零三|
| 十一|正常的|三百二十三|二千七百二十六元九十九分|
| 十二|正常的|三百七十|六千六百九十三点九四|
这就是我希望我的表看起来像-不确定如果本月是应该看起来像虽然。
| 每月|字符串通道|iOrder计数|f营业额|当前月份|字符串当前日期|
| - -|- -|- -|- -|- -|- -|
| 十二|正常的|小行星2234|小行星33048.66|第0页|2021年12月22日13时54分09秒|
| 一个|正常的|小行星2234|小行星33048.66|第0页|2022年1月22日13时54分09秒|
| 2个|正常的|小行星6638|小行星66711.96|第0页|2022年2月22日13时54分09秒|
| 三个|正常的|小行星4266|小行星30742.70|第0页|2022年3月22日13时54分09秒|
| 四个|正常的|一百七十一|七百六十六点一零|第0页|2022年4月22日13时54分09秒|
| 五个|正常的|九十|九百二十六点五五|第0页|2022年5月22日13时54分09秒|
| 六个|正常的|小行星1254|小行星12334.04|第0页|2022年6月22日13时54分09秒|
| 七个|正常的|九二一|小行星2990.35|第0页|2022年7月22日13时54分09秒|
| 八个|正常的|小行星946|小行星46407.63|第0页|2022年8月22日13时54分09秒|
| 九个|正常的|小行星5837|小行星31623.17|第0页|2022年9月22日13时54分09秒|
| 10个|正常的|七十|三百零五点零三|第0页|2022年10月22日13时54分09秒|
| 十一|正常的|三百二十三|二千七百二十六元九十九分|一个|2022年10月22日13时54分09秒|
| 十二|正常的|三百七十|六千六百九十三点九四|第0页|2022年12月22日13时54分09秒|
| 一个|b2b网络|三百七十|六千六百九十三点九四|第0页|2023年1月22日13时54分09秒|
| 2个|正常的|三百七十|六千六百九十三点九四|第0页|2023年2月22日13时54分09秒|
| 三个|b2b网络|三百七十|六千六百九十三点九四|第0页|2023年3月22日13时54分09秒|
| 四个|正常的|三百七十|六千六百九十三点九四|第0页|2023年4月22日13时54分09秒|
希望这是有意义的,但如果我需要详细说明一些事情,然后请问:)

v8wbuo2f

v8wbuo2f1#

因此,如果当前日期/时间为2022-10-31 13:00:00,则2022年2月分组的终止日期/时间应该是什么?显然,它不能是2022-02-31 13:00:00。它应该是2022-02-28 23:59:59吗?
下面是我对你的查询的尝试。如果你有一个可靠的(和/或专用的)序列表,那么你可以摆脱seq派生表。

SELECT
    MONTH(cal.monthStart)                           AS iMonth,
    s_order_main.channel                            AS strChannel,
    COUNT(DISTINCT s_order_styles.s_order_style_id) AS iOrderCount,
    SUM(DISTINCT s_order_styles.sales_price)        AS fTurnover,
    IF(DATE(cal.monthEnd) = CURRENT_DATE, 1, 0)     AS iCurrentMonth,
    cal.monthEnd                                    AS strCurrentDate
FROM (
    SELECT
        seq.n period,
        (CURRENT_DATE - INTERVAL (DAY(CURRENT_DATE) - 1) DAY - INTERVAL (11 - seq.n) MONTH) monthStart,
        IF(
            DAY(CURRENT_DATE) > DAY((CURRENT_DATE - INTERVAL (11 - seq.n) MONTH)),
            LAST_DAY(CURRENT_DATE - INTERVAL (11 - seq.n) MONTH) + INTERVAL 1 DAY - INTERVAL 1 SECOND,
            (NOW() - INTERVAL (11 - seq.n) MONTH)
        ) monthEnd
    FROM (
        SELECT  0 n UNION ALL SELECT  1 UNION ALL SELECT  2 UNION ALL SELECT  3 UNION ALL SELECT  4 UNION ALL SELECT  5 UNION ALL SELECT  6 UNION ALL SELECT  7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL
        SELECT 10   UNION ALL SELECT 11 UNION ALL SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15 UNION ALL SELECT 16
    ) seq
) cal
LEFT JOIN s_order_main
    ON s_order_main.added_date BETWEEN cal.monthStart AND cal.monthEnd
    AND s_order_main.order_type = 'pre'
LEFT JOIN s_order_styles
    ON s_order_styles.s_order_main_id = s_order_main.id
GROUP BY cal.period, strChannel;
ercv8c1e

ercv8c1e2#

我猜你想在你的WHERE中加入一些日期运算

..
   && s_order_main.added_date >= DATE_ADD(last_day(DATE_ADD(curdate(), interval -12 month)), interval 1 day)
   && s_order_main.added_date < DATE_ADD(last_day(DATE_ADD(curdate(), interval 5 month)), interval 1 day)
 ..

Demo

相关问题