【问题标题】:Splitting month into weeks and using GROUP BY将月份拆分为几周并使用 GROUP BY
【发布时间】:2016-02-21 07:28:51
【问题描述】:

这是一个问题,我在任何地方都找不到答案。好的。这里是。 我有两个日期范围(本月和上个月)

上个月 - 2015 年 1 月 1 日(2015 年 1 月 1 日)至 2015 年 1 月 31 日 本月 - 01/02/2015(2015 年 2 月 1 日)至 28/02/2015

现在,每个月都有几周。我有一个包含 created_at 列的表。我想将所有记录按周提取到一个数组中(以绘制图表)及其对应的 sum(value) 或 count(value) 。

所以它会是这样的: 上个月: 第 1 - 25 周 第 2 周 - 第 34 周 等等

本月: 第 1 周:55 第 2 周:56 等等

created_at 中的日期格式为:2015-07-21 01:27:14 (Y-m-d H:i:s)

【问题讨论】:

  • 请发布数据结构并展示您到目前为止所尝试的内容。
  • 您是否总是有特定一周的数据?您是否需要在没有记录的情况下输出一周的总和和计数为 0 的行?

标签: php mysql date datetime


【解决方案1】:

MySql 可以使用WEEK() 获取周数(从1到53)

你可以在星期一使用WEEKDAY()DAYOFWEEK() 第一个 bigins,然后在星期日使用第二个。

您可以将它们用于GROUP BYHAVING

类似:

SELECT count(*)
FROM `YourTable` 
WHERE `created_at` >= '2015-10-01' AND `created_at`< '2015-11-01'
GROUP BY WEEK(`created_at`)

要使用您找到的解决方法,您需要执行类似的操作:

创建一个名为“numbers”的表,其中包含一个字段“id”(自动增量)和 31 行(一个月中的每一天)

然后使用这样的查询:

SELECT count(i.created_at)
FROM
(SELECT DATE_FORMAT(DATE_ADD('2015-12-01', INTERVAL -n.id DAY), '%Y-%m-%d') AS AllDays
             FROM numbers n) AS DaysOfMonth
Left Join
YourTableName i
ON STR_TO_DATE(i.created_at, '%Y-%m-%d') = DaysOfMonth.AllDays
GROUP BY WEEK(AllDays)

(尽量适应你的需要)

【讨论】:

  • 我们可以修改它,以便在该周的 count(*) 为零的情况下返回 0 或 null 吗?
  • @kirobo 我不确定,但我认为您需要一个每周都有一个循环的存储过程来执行您的要求。否则,您可以使用UNION 并每周重复查询或使用php 每周提取
  • 我想不通。这很简单。我觉得自己好傻。 stackoverflow.com/questions/3538858/… 说我需要创建一个表,为什么?这么简单的任务,我为什么要建表?
  • @kirobo 非常好的解决方法:)。您需要创建的表使您能够通过加入它们来获得每周的结果(即使您正在使用的表中没有记录)
  • @kirobo 我给你添加了一些提示
【解决方案2】:

您需要做的是按周分组,然后对这些值求和。下面是一个简单的例子来说明它是如何工作的:

SELECT DATE_FORMAT(created_at,'%Y-%V') as interval, SUM(units_sold) as total_sold
FROM sales 
GROUP BY DATE_FORMAT(created_at,'%Y-%V')

您将获得的是年份和周数(例如 2015-50)以及该间隔的总和。

这样的表:

+----+------------+---------------------+
| id | units_sold |     created_at      |
+----+------------+---------------------+
|  1 |          2 | 2015-01-01 09:00:00 |
|  2 |          4 | 2015-01-04 10:00:00 |
|  3 |          1 | 2015-01-12 12:00:00 |
|  4 |          4 | 2015-01-16 13:00:00 |
+----+------------+---------------------+

会导致:

+----------+------------+
| interval | total_sold |
+----------+------------+
| 2015-01  |          6 |
| 2015-03  |          5 |
+----------+------------+

【讨论】:

  • SELECT DATE_FORMAT(created_at,'%Y-%V') AS intrvl, COUNT(DISTINCT id) AS records FROM users GROUP BY DATE_FORMAT(created_at,'%Y-%V') 它给了我年和周数以及一年中相应周的总数,我想查找在月初和月底之间进行的所有新注册(计数(不同的 id)作为新记录)。
  • 例如使用PHP,$nmFrom = date("Y-m-d H:i:s",strtotime("上个月第一天")); $nmTo = date("Y-m-d H:i:s",strtotime("上个月最后一天"));
  • 你可以使用不同的分组。尝试使用%Y-%m,它将按月份分组。
  • 我需要几周的时间。
  • 如果您需要几周的时间,您可以使用我发布的内容。
【解决方案3】:

我觉得对你有用……

SELECT GROUP_CONCAT(id), COUNT(id) AS idcount,SUM(id) AS idsum,
MONTHNAME(order_created_date) AS month_name, WEEK(order_created_date) 
AS weeks  FROM orders GROUP BY WEEK(order_created_date) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 2019-07-27
    • 2023-04-03
    • 1970-01-01
    • 2015-10-21
    • 2023-01-15
    • 1970-01-01
    相关资源
    最近更新 更多