【问题标题】:SQL Period between two dates, query for every single day's average两个日期之间的SQL周期,查询每一天的平均值
【发布时间】:2012-11-14 18:56:03
【问题描述】:

我有几个条目保存如下:

ID | StartDate | Enddate | Amount

我现在确实想查询此期间的每一天,以划分这些日期之间的总金额。

例如

1 | 2012-01-01 | 2012-01-05 | 10
2 | 2012-01-04 | 2012-01-05 | 20

应该变成

2012-01-01 |  2
2012-01-02 |  2
2012-01-03 |  2
2012-01-04 | 12
2012-01-05 | 12

这可能吗?我无法想象如何从期间得出单日值。提前致谢!

【问题讨论】:

  • 您使用的是什么数据库和版本?
  • 我正在运行一个 MySQL 数据库“mysqlnd 5.0.8-dev - 20102224 - $Revision: 310735 $”。不过,我会很高兴得到一个一般性的答案,所以我可以想象 pariod 的“分离”是如何工作的。谢谢!

标签: sql date average period


【解决方案1】:

当您需要所有日期的查询结果时,需要有 Dates 表 (little help)。我给你答案,不使用日期表。

SQLFIDDLEExample 1 with Date Table

查询:

SELECT 
DATE_FORMAT(td.TimeKey, '%Y-%m-%d')  as Date,
SUM(Amount/(SELECT COUNT(tdc.TimeKey) 
       FROM Table1 t1c, TDate tdc
       WHERE t1c.StartDate<= tdc.TimeKey
          AND t1c.Enddate >= tdc.TimeKey
          AND t1c.ID = t1.ID )) as Total_Amount
FROM Table1 t1, TDate td
WHERE t1.StartDate<= td.TimeKey
  AND t1.Enddate >= td.TimeKey
GROUP BY Date
ORDER BY Date

结果:

|       DATE | TOTAL_AMOUNT |
-----------------------------
| 2012-01-01 |            2 |
| 2012-01-02 |            2 |
| 2012-01-03 |            2 |
| 2012-01-04 |           12 |
| 2012-01-05 |           12 |

不使用日期表的结果相同:

SQLFIddle example just with SQL (without Date table)

【讨论】:

    【解决方案2】:

    您可以考虑使用整数表来创建日期范围。请参阅我的回答 here 了解我在说什么。

    在您的情况下,您将确定每个日期范围内的天数并将其用作最大整数。该最大整数既可以将行数限制为适当的天数,又可以计算日期范围内每一天的平均值。

    【讨论】:

    • 感谢您的建议。稍后我会看看您的解决方案,但恐怕我无法更改 db-table 的结构。我可能不得不在 php 中进行这些计算并触发几个查询(每天一个)。
    • @thoughtgap:您不需要更改任何表结构。您只需要添加一个名为numbers 的单列表。如果这不可能,您甚至可以将nums 放在另一个数据库中,然后像这样FROM mytable JOIN otherdb.nums 加入它
    • 哦,我明白了。感谢您的建议,以后我一定会尝试一下以用于学习目的。为了立竿见影的成功,我更喜欢下面的解决方案。祝你有美好的一天!
    猜你喜欢
    • 1970-01-01
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    • 2023-01-25
    相关资源
    最近更新 更多