我有一些看起来像这样的期间数据:
PName DtFrom DtTo Amount
Period_1 2018-01-01 2018-01-10 100
Period_2 2018-01-03 2018-01-08 10
Period_3 2018-01-05 2018-01-12 1
我想获得以下时间序列,添加每个时期日期框架内的金额:
2018-01-01 100
2018-01-02 100
2018-01-03 110
2018-01-04 110
2018-01-05 111
2018-01-06 111
2018-01-07 111
2018-01-08 111
2018-01-09 101
2018-01-10 101
2018-01-11 1
2018-01-12 1
我使用DATE_ADD,DATEDIFF等进行了大量研究,也使用了其他StackOverflow问题。但没有成功。有什么想法吗?
答案 0 :(得分:1)
虽然我真的主张在应用程序代码中处理这个问题,但这是一个使用一个小整数实用程序表的解决方案。您可以使用日历表,或者即时构建一个整数序列...
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(Perid SERIAL PRIMARY KEY
,DtFrom DATE NOT NULL
,DtTo DATE NOT NULL
,Amount INT NOT NULL
);
INSERT INTO my_table VALUES
(1,'2018-01-01','2018-01-10',100),
(2,'2018-01-03','2018-01-08',10),
(3,'2018-01-05','2018-01-12',1);
SELECT * FROM ints;
+---+
| i |
+---+
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
+---+
SELECT dtfrom + INTERVAL y.i DAY dt
, SUM(x.amount) total
FROM my_table x
JOIN ints y
WHERE dtfrom + INTERVAL y.i DAY <= dtto
GROUP
BY dt;
+------------+-------+
| dt | total |
+------------+-------+
| 2018-01-01 | 100 |
| 2018-01-02 | 100 |
| 2018-01-03 | 110 |
| 2018-01-04 | 110 |
| 2018-01-05 | 111 |
| 2018-01-06 | 111 |
| 2018-01-07 | 111 |
| 2018-01-08 | 111 |
| 2018-01-09 | 101 |
| 2018-01-10 | 101 |
| 2018-01-11 | 1 |
| 2018-01-12 | 1 |
+------------+-------+
如果dtfrom和dtto之间的差距可能超过10天,您可以按照以下方式扩展解决方案......
SELECT dtfrom + INTERVAL i2.i*10 + i1.i DAY dt
, SUM(x.amount) total
FROM my_table x
JOIN ints i1
JOIN ints i2
WHERE dtfrom + INTERVAL i2.i*10 + i1.i DAY <= dtto
GROUP
BY dt;
答案 1 :(得分:0)
试试这个
select
sum(if(STR_TO_DATE(?, '%d-%m-%Y') >= so_period_date.dt_from and
STR_TO_DATE(?, '%d-%m-%Y') <= so_period_date.dt_to,
so_period_date.amount, 0)) as amount
from so_period_date
答案 2 :(得分:0)
试试这个:
SELECT A.`DATE`, B.Amount
FROM
(SELECT TO_DATE('2018-01-01','YYYY-MM-DD') `DATE` UNION ALL
SELECT TO_DATE('2018-01-02','YYYY-MM-DD') `DATE` UNION ALL
SELECT TO_DATE('2018-01-03','YYYY-MM-DD') `DATE` UNION ALL
SELECT TO_DATE('2018-01-04','YYYY-MM-DD') `DATE` UNION ALL
SELECT TO_DATE('2018-01-05','YYYY-MM-DD') `DATE` UNION ALL
SELECT TO_DATE('2018-01-06','YYYY-MM-DD') `DATE` UNION ALL
SELECT TO_DATE('2018-01-07','YYYY-MM-DD') `DATE` UNION ALL
SELECT TO_DATE('2018-01-08','YYYY-MM-DD') `DATE` UNION ALL
SELECT TO_DATE('2018-01-09','YYYY-MM-DD') `DATE` UNION ALL
SELECT TO_DATE('2018-01-10','YYYY-MM-DD') `DATE` UNION ALL
SELECT TO_DATE('2018-01-11','YYYY-MM-DD') `DATE` UNION ALL
SELECT TO_DATE('2018-01-12','YYYY-MM-DD') `DATE`
) A LEFT JOIN yourTable B ON A.`DATE` BETWEEN B.DtFrom AND b.DtTo;
如果您必须在sql中执行此查询,那么它很容易在应用程序逻辑中获得预期结果,就像@Strawberry在他对您的问题的评论中指出的那样。