SQL 显示当年的所有周数 (52)
SQL showing all weeks(52) in current year
如何显示 当前 年
的所有周数 (52)
我查询过:
SELECT
COALESCE(IF(DATE_FORMAT(q.date_add, '%Y-%u') IS NULL,
(DATE_FORMAT(q.date_add, '%Y-%u')),
DATE_FORMAT(q.date_add, '%Y WEEK %u'))) AS CurrentDate,
COALESCE(IF(SUM(q.totalExcl) IS NULL,
0,
SUM(q.totalExcl))) AS total
FROM
expoled.ps_oxoquotation_quotationstate_history h
RIGHT JOIN
expoled.ps_oxoquotation_quotation q ON h.idQuotation = q.idQuotation
LEFT JOIN
expoled.ps_employee e ON h.idEmployee = e.id_employee
INNER JOIN
expoled.ps_sv_employee_meta m ON h.idEmployee = m.id_employee
WHERE
h.idEmployee = 39
AND YEAR(q.date_add) = YEAR(UTC_TIMESTAMP())
AND h.idQuotationState = 3
GROUP BY IFNULL(CurrentDate, '')
我想我需要在这里做点什么:
SELECT
IFNULL(DATE_FORMAT(q.date_add, '%Y WEEK %u'), 0) AS CurrentDate,
IFNULL(SUM(q.totalExcl),0) AS total
FROM
我尝试输入 IFNULL,但结果相同
这就是我现在得到的:
它显示当前的第 5 周到第 16 周。
第 1 周到第 4 周也没有任何内容,因为没有数据。它只需要显示一个简单的零(0)
所以我想要的是它需要显示从第 1 周到第 52 周的标准,如果没有数据则只有 0
查询正在运行,没有任何错误。
为了获得固定的周数,没有特定的 table,我尝试了这个。
Table XX1只是为了做测试,你可以用你的table之一代替。如果它有记录数 >=366 你可以消除 CROSS JOIN.
CREATE TABLE XX1 (id INT);
INSERT INTO XX1 VALUES (1);
INSERT INTO XX1 VALUES (2);
INSERT INTO XX1 VALUES (3);
INSERT INTO XX1 VALUES (4);
INSERT INTO XX1 VALUES (5);
SELECT DISTINCT DATE_FORMAT(RN, '%Y w%u') AS CURR_WEEK
FROM
(SELECT @RN:=DATE_ADD(str_to_date( CONCAT(YEAR(UTC_TIMESTAMP()) ,'0101'), '%Y%m%d'), INTERVAL -1 DAY) AS RN
UNION ALL
SELECT @RN:=DATE_ADD(@RN, INTERVAL 1 DAY) AS RN
FROM (SELECT 1 AS DUM FROM XX1
CROSS JOIN XX1 X2
CROSS JOIN XX1 X3
CROSS JOIN XX1 X4
) Y LIMIT 366
) X
WHERE YEAR(RN)=YEAR(UTC_TIMESTAMP())
ORDER BY 1;
DROP TABLE XX1 ;
输出:
CURR_WEEK
1 2017 w00
2 2017 w01
3 2017 w02
4 2017 w03
5 2017 w04
...
51 2017 w50
52 2017 w51
53 2017 w52
我想你可以用它来代替你的查询(当然我不能对你的查询做任何测试)
其他(希望是最后一个)版本:
SELECT Y.CURR_WEEK,
COALESCE(SUM(qh.totalExcl), 0) AS total
FROM
(SELECT DISTINCT DATE_FORMAT(RN, '%Y-%u') AS CURR_WEEK
FROM
(SELECT @RN:=DATE_ADD(str_to_date( CONCAT(YEAR(UTC_TIMESTAMP()) ,'0101'), '%Y%m%d'), INTERVAL -1 DAY) AS RN
UNION ALL
SELECT @RN:=DATE_ADD(@RN, INTERVAL 1 DAY) AS RN
FROM XX1
CROSS JOIN XX1 X2
CROSS JOIN XX1 X3
CROSS JOIN XX1 X4
) X
WHERE YEAR(RN)=YEAR(UTC_TIMESTAMP())
) Y
LEFT JOIN (SELECT q.date_add, q.totalExcl, h.idEmployee
FROM expoled.ps_oxoquotation_quotation q
INNER JOIN expoled.ps_oxoquotation_quotationstate_history h ON h.idQuotation = q.idQuotation
WHERE h.idEmployee = 39 AND h.idQuotationState = 3) qh ON DATE_FORMAT(qh.date_add, '%Y-%u')=Y.CURR_WEEK
/* are these useless? */
LEFT JOIN expoled.ps_employee e ON qh.idEmployee = e.id_employee
LEFT JOIN expoled.ps_sv_employee_meta m ON qh.idEmployee = m.id_employee
GROUP BY Y.CURR_WEEK
在 MariaDB 中,构建 table 周真的很容易:
mysql> SELECT ('2017-01-02' + INTERVAL seq WEEK) AS wk FROM seq_0_to_53;
+------------+
| wk |
+------------+
| 2017-01-02 |
| 2017-01-09 |
| 2017-01-16 |
| 2017-01-23 |
| 2017-01-30 |
| 2017-02-06 |
| 2017-02-13 |
| 2017-02-20 |
...
基于此,您可以:
JOIN
到您的 table 并根据需要使用 wk
。
- 更改开始日期以与星期日而不是星期一(或其他日期)对齐
- 想玩多少周就玩多少周
- 事后使用
WHERE wk BETWEEN ...
限制范围
- 通过获取类似
CONCAT('2017 WEEK ', seq) AS iso
的内容,您可以获得所需的语法。
如何显示 当前 年
的所有周数 (52)我查询过:
SELECT
COALESCE(IF(DATE_FORMAT(q.date_add, '%Y-%u') IS NULL,
(DATE_FORMAT(q.date_add, '%Y-%u')),
DATE_FORMAT(q.date_add, '%Y WEEK %u'))) AS CurrentDate,
COALESCE(IF(SUM(q.totalExcl) IS NULL,
0,
SUM(q.totalExcl))) AS total
FROM
expoled.ps_oxoquotation_quotationstate_history h
RIGHT JOIN
expoled.ps_oxoquotation_quotation q ON h.idQuotation = q.idQuotation
LEFT JOIN
expoled.ps_employee e ON h.idEmployee = e.id_employee
INNER JOIN
expoled.ps_sv_employee_meta m ON h.idEmployee = m.id_employee
WHERE
h.idEmployee = 39
AND YEAR(q.date_add) = YEAR(UTC_TIMESTAMP())
AND h.idQuotationState = 3
GROUP BY IFNULL(CurrentDate, '')
我想我需要在这里做点什么:
SELECT
IFNULL(DATE_FORMAT(q.date_add, '%Y WEEK %u'), 0) AS CurrentDate,
IFNULL(SUM(q.totalExcl),0) AS total
FROM
我尝试输入 IFNULL,但结果相同
这就是我现在得到的:
它显示当前的第 5 周到第 16 周。 第 1 周到第 4 周也没有任何内容,因为没有数据。它只需要显示一个简单的零(0)
所以我想要的是它需要显示从第 1 周到第 52 周的标准,如果没有数据则只有 0
查询正在运行,没有任何错误。
为了获得固定的周数,没有特定的 table,我尝试了这个。 Table XX1只是为了做测试,你可以用你的table之一代替。如果它有记录数 >=366 你可以消除 CROSS JOIN.
CREATE TABLE XX1 (id INT);
INSERT INTO XX1 VALUES (1);
INSERT INTO XX1 VALUES (2);
INSERT INTO XX1 VALUES (3);
INSERT INTO XX1 VALUES (4);
INSERT INTO XX1 VALUES (5);
SELECT DISTINCT DATE_FORMAT(RN, '%Y w%u') AS CURR_WEEK
FROM
(SELECT @RN:=DATE_ADD(str_to_date( CONCAT(YEAR(UTC_TIMESTAMP()) ,'0101'), '%Y%m%d'), INTERVAL -1 DAY) AS RN
UNION ALL
SELECT @RN:=DATE_ADD(@RN, INTERVAL 1 DAY) AS RN
FROM (SELECT 1 AS DUM FROM XX1
CROSS JOIN XX1 X2
CROSS JOIN XX1 X3
CROSS JOIN XX1 X4
) Y LIMIT 366
) X
WHERE YEAR(RN)=YEAR(UTC_TIMESTAMP())
ORDER BY 1;
DROP TABLE XX1 ;
输出:
CURR_WEEK
1 2017 w00
2 2017 w01
3 2017 w02
4 2017 w03
5 2017 w04
...
51 2017 w50
52 2017 w51
53 2017 w52
我想你可以用它来代替你的查询(当然我不能对你的查询做任何测试)
其他(希望是最后一个)版本:
SELECT Y.CURR_WEEK,
COALESCE(SUM(qh.totalExcl), 0) AS total
FROM
(SELECT DISTINCT DATE_FORMAT(RN, '%Y-%u') AS CURR_WEEK
FROM
(SELECT @RN:=DATE_ADD(str_to_date( CONCAT(YEAR(UTC_TIMESTAMP()) ,'0101'), '%Y%m%d'), INTERVAL -1 DAY) AS RN
UNION ALL
SELECT @RN:=DATE_ADD(@RN, INTERVAL 1 DAY) AS RN
FROM XX1
CROSS JOIN XX1 X2
CROSS JOIN XX1 X3
CROSS JOIN XX1 X4
) X
WHERE YEAR(RN)=YEAR(UTC_TIMESTAMP())
) Y
LEFT JOIN (SELECT q.date_add, q.totalExcl, h.idEmployee
FROM expoled.ps_oxoquotation_quotation q
INNER JOIN expoled.ps_oxoquotation_quotationstate_history h ON h.idQuotation = q.idQuotation
WHERE h.idEmployee = 39 AND h.idQuotationState = 3) qh ON DATE_FORMAT(qh.date_add, '%Y-%u')=Y.CURR_WEEK
/* are these useless? */
LEFT JOIN expoled.ps_employee e ON qh.idEmployee = e.id_employee
LEFT JOIN expoled.ps_sv_employee_meta m ON qh.idEmployee = m.id_employee
GROUP BY Y.CURR_WEEK
在 MariaDB 中,构建 table 周真的很容易:
mysql> SELECT ('2017-01-02' + INTERVAL seq WEEK) AS wk FROM seq_0_to_53;
+------------+
| wk |
+------------+
| 2017-01-02 |
| 2017-01-09 |
| 2017-01-16 |
| 2017-01-23 |
| 2017-01-30 |
| 2017-02-06 |
| 2017-02-13 |
| 2017-02-20 |
...
基于此,您可以:
JOIN
到您的 table 并根据需要使用wk
。- 更改开始日期以与星期日而不是星期一(或其他日期)对齐
- 想玩多少周就玩多少周
- 事后使用
WHERE wk BETWEEN ...
限制范围
- 通过获取类似
CONCAT('2017 WEEK ', seq) AS iso
的内容,您可以获得所需的语法。