php - 如何生成周表并按天和小时拆分

标签 php mysql symfony date doctrine

首先要明确;有这样一个例子:

enter image description here

我可以用这个查询得到类(class):

$qb
    ->select("c")
    ->from("ATLReservationBundle:Course", "c")
    ->where("WEEK(c.courseDate, 1) = WEEK(CURRENT_DATE(), 1)")
    ->orderBy("c.courseDate", "ASC");

查询结果:

{   "courses": [
    {
      "id": 110,
      "name": "Pilates",
      "quota": 8,
      "course_date": "2015-08-31T12:15:00+0000",
      "studio": {
        "id": 2,
        "name": "Stüdyo 2"
      },
      "trainer": {
        "id": 1,
        "name": "-"
      }
    },
    {
      "id": 135,
      "name": "Spinning",
      "quota": 8,
      "course_date": "2015-08-31T19:30:00+0000",
      "studio": {
        "id": 2,
        "name": "Stüdyo 2"
      },
      "trainer": {
        "id": 1,
        "name": "-"
      }
    },
    {
      "id": 154,
      "name": "Kick Box",
      "quota": 6,
      "course_date": "2015-08-31T20:00:00+0000",
      "studio": {
        "id": 1,
        "name": "Stüdyo 1"
      },
      "trainer": {
        "id": 1,
        "name": "-"
      }
    },
    {
      "id": 133,
      "name": "Spinning",
      "quota": 8,
      "course_date": "2015-09-01T12:15:00+0000",
      "studio": {
        "id": 2,
        "name": "Stüdyo 2"
      },
      "trainer": {
        "id": 1,
        "name": "-"
      }
    },
    {
      "id": 113,
      "name": "Crunch 30 Min.",
      "quota": 8,
      "course_date": "2015-09-01T18:30:00+0000",
      "studio": {
        "id": 2,
        "name": "Stüdyo 2"
      },
      "trainer": {
        "id": 1,
        "name": "-"
      }
    },
    {
      "id": 112,
      "name": "Pilates",
      "quota": 8,
      "course_date": "2015-09-01T19:00:00+0000",
      "studio": {
        "id": 2,
        "name": "Stüdyo 2"
      },
      "trainer": {
        "id": 1,
        "name": "-"
      }
    },
    {
      "id": 150,
      "name": "Spinning",
      "quota": 8,
      "course_date": "2015-09-01T19:30:00+0000",
      "studio": {
        "id": 2,
        "name": "Stüdyo 2"
      },
      "trainer": {
        "id": 1,
        "name": "-"
      }
    },
    {
      "id": 136,
      "name": "TRX Group",
      "quota": 5,
      "course_date": "2015-09-01T20:00:00+0000",
      "studio": {
        "id": 2,
        "name": "Stüdyo 2"
      },
      "trainer": {
        "id": 1,
        "name": "-"
      }
    },
    {
      "id": 159,
      "name": "Pilates",
      "quota": 8,
      "course_date": "2015-09-02T10:00:00+0000",
      "studio": {
        "id": 2,
        "name": "Stüdyo 2"
      },
      "trainer": {
        "id": 1,
        "name": "-"
      }
    },
    {
      "id": 156,
      "name": "Stretching",
      "quota": 7,
      "course_date": "2015-09-02T18:30:00+0000",
      "studio": {
        "id": 2,
        "name": "Stüdyo 2"
      },
      "trainer": {
        "id": 1,
        "name": "-"
      }
    },
    {
      "id": 127,
      "name": "Zumba",
      "quota": 6,
      "course_date": "2015-09-02T19:00:00+0000",
      "studio": {
        "id": 1,
        "name": "Stüdyo 1"
      },
      "trainer": {
        "id": 1,
        "name": "-"
      }
    },
    {
      "id": 148,
      "name": "Kick Box",
      "quota": 6,
      "course_date": "2015-09-02T20:00:00+0000",
      "studio": {
        "id": 1,
        "name": "Stüdyo 1"
      },
      "trainer": {
        "id": 1,
        "name": "-"
      }
    },
    {
      "id": 138,
      "name": "Crunch 30 Min.",
      "quota": 8,
      "course_date": "2015-09-03T12:15:00+0000",
      "studio": {
        "id": 1,
        "name": "Stüdyo 1"
      },
      "trainer": {
        "id": 1,
        "name": "-"
      }
    },
    {
      "id": 121,
      "name": "Pilates",
      "quota": 8,
      "course_date": "2015-09-03T19:00:00+0000",
      "studio": {
        "id": 2,
        "name": "Stüdyo 2"
      },
      "trainer": {
        "id": 1,
        "name": "-"
      }
    },
    {
      "id": 117,
      "name": "TRX",
      "quota": 8,
      "course_date": "2015-09-03T20:00:00+0000",
      "studio": {
        "id": 2,
        "name": "Stüdyo 2"
      },
      "trainer": {
        "id": 1,
        "name": "-"
      }
    },
    {
      "id": 131,
      "name": "Spinning",
      "quota": 8,
      "course_date": "2015-09-03T20:00:00+0000",
      "studio": {
        "id": 2,
        "name": "Stüdyo 2"
      },
      "trainer": {
        "id": 1,
        "name": "-"
      }
    },
    {
      "id": 142,
      "name": "Pilates",
      "quota": 8,
      "course_date": "2015-09-04T12:15:00+0000",
      "studio": {
        "id": 2,
        "name": "Stüdyo 2"
      },
      "trainer": {
        "id": 1,
        "name": "-"
      }
    },
    {
      "id": 147,
      "name": "LBT 30 min.",
      "quota": 8,
      "course_date": "2015-09-04T19:00:00+0000",
      "studio": {
        "id": 1,
        "name": "Stüdyo 1"
      },
      "trainer": {
        "id": 1,
        "name": "-"
      }
    },
    {
      "id": 141,
      "name": "Crunch 30 Min.",
      "quota": 8,
      "course_date": "2015-09-04T19:30:00+0000",
      "studio": {
        "id": 2,
        "name": "Stüdyo 2"
      },
      "trainer": {
        "id": 1,
        "name": "-"
      }
    },
    {
      "id": 130,
      "name": "Crunch 30 Min.",
      "quota": 8,
      "course_date": "2015-09-05T14:00:00+0000",
      "studio": {
        "id": 2,
        "name": "Stüdyo 2"
      },
      "trainer": {
        "id": 1,
        "name": "-"
      }
    }   ] }

但我想像这样对这些数据进行分组;

DAY - 31
    HOUR - 12:15 > Coursename
    HOUR - 19:30 > Coursename
DAY - 01
    HOUR - 10:00...

我不知道该怎么做,有人知道吗?

更新

新查询:

   $qb
        ->select("c, HOUR(c.courseDate) as hour, DAY(c.courseDate) as day")
        ->from("ATLReservationBundle:Course", "c")
        ->where("WEEK(c.courseDate, 1) = WEEK(CURRENT_DATE(), 1)")
        ->orderBy("c.courseDate", "ASC")
        ->groupBy("hour, day");

但是;此查询存在问题,我无法按 HOUR(c.courseDate), DAY(c.courseDate) 分组,因为我收到此错误:

Error: Cannot group by undefined identification or result variable.

因此,我将小时和日期定义为选择区域中的变量。 我不想将日期和时间视为不同的变量。

查询结果:

{
  "courses": [
    {
      "0": {
        "id": 110,
        "name": "Pilates",
        "quota": 8,
        "course_date": "2015-08-31T12:15:00+0000",
        "studio": {
          "id": 2,
          "name": "Stüdyo 2"
        },
        "trainer": {
          "id": 1,
          "name": "-"
        }
      },
      "hour": "12",
      "day": "31"
    },
    {
      "0": {
        "id": 135,
        "name": "Spinning",
        "quota": 8,
        "course_date": "2015-08-31T19:30:00+0000",
        "studio": {
          "id": 2,
          "name": "Stüdyo 2"
        },
        "trainer": {
          "id": 1,
          "name": "-"
        }
      },
      "hour": "19",
      "day": "31"
    },
    {
      "0": {
        "id": 154,
        "name": "Kick Box",
        "quota": 6,
        "course_date": "2015-08-31T20:00:00+0000",
        "studio": {
          "id": 1,
          "name": "Stüdyo 1"
        },
        "trainer": {
          "id": 1,
          "name": "-"
        }
      },
      "hour": "20",
      "day": "31"
    },
    {
      "0": {
        "id": 133,
        "name": "Spinning",
        "quota": 8,
        "course_date": "2015-09-01T12:15:00+0000",
        "studio": {
          "id": 2,
          "name": "Stüdyo 2"
        },
        "trainer": {
          "id": 1,
          "name": "-"
        }
      },
      "hour": "12",
      "day": "1"
    },
    {
      "0": {
        "id": 113,
        "name": "Crunch 30 Min.",
        "quota": 8,
        "course_date": "2015-09-01T18:30:00+0000",
        "studio": {
          "id": 2,
          "name": "Stüdyo 2"
        },
        "trainer": {
          "id": 1,
          "name": "-"
        }
      },
      "hour": "18",
      "day": "1"
    },
    {
      "0": {
        "id": 112,
        "name": "Pilates",
        "quota": 8,
        "course_date": "2015-09-01T19:00:00+0000",
        "studio": {
          "id": 2,
          "name": "Stüdyo 2"
        },
        "trainer": {
          "id": 1,
          "name": "-"
        }
      },
      "hour": "19",
      "day": "1"
    },
    {
      "0": {
        "id": 136,
        "name": "TRX Group",
        "quota": 5,
        "course_date": "2015-09-01T20:00:00+0000",
        "studio": {
          "id": 2,
          "name": "Stüdyo 2"
        },
        "trainer": {
          "id": 1,
          "name": "-"
        }
      },
      "hour": "20",
      "day": "1"
    },
    {
      "0": {
        "id": 159,
        "name": "Pilates",
        "quota": 8,
        "course_date": "2015-09-02T10:00:00+0000",
        "studio": {
          "id": 2,
          "name": "Stüdyo 2"
        },
        "trainer": {
          "id": 1,
          "name": "-"
        }
      },
      "hour": "10",
      "day": "2"
    },
    {
      "0": {
        "id": 156,
        "name": "Stretching",
        "quota": 7,
        "course_date": "2015-09-02T18:30:00+0000",
        "studio": {
          "id": 2,
          "name": "Stüdyo 2"
        },
        "trainer": {
          "id": 1,
          "name": "-"
        }
      },
      "hour": "18",
      "day": "2"
    },
    {
      "0": {
        "id": 127,
        "name": "Zumba",
        "quota": 6,
        "course_date": "2015-09-02T19:00:00+0000",
        "studio": {
          "id": 1,
          "name": "Stüdyo 1"
        },
        "trainer": {
          "id": 1,
          "name": "-"
        }
      },
      "hour": "19",
      "day": "2"
    },
    {
      "0": {
        "id": 148,
        "name": "Kick Box",
        "quota": 6,
        "course_date": "2015-09-02T20:00:00+0000",
        "studio": {
          "id": 1,
          "name": "Stüdyo 1"
        },
        "trainer": {
          "id": 1,
          "name": "-"
        }
      },
      "hour": "20",
      "day": "2"
    },
    {
      "0": {
        "id": 138,
        "name": "Crunch 30 Min.",
        "quota": 8,
        "course_date": "2015-09-03T12:15:00+0000",
        "studio": {
          "id": 1,
          "name": "Stüdyo 1"
        },
        "trainer": {
          "id": 1,
          "name": "-"
        }
      },
      "hour": "12",
      "day": "3"
    },
    {
      "0": {
        "id": 121,
        "name": "Pilates",
        "quota": 8,
        "course_date": "2015-09-03T19:00:00+0000",
        "studio": {
          "id": 2,
          "name": "Stüdyo 2"
        },
        "trainer": {
          "id": 1,
          "name": "-"
        }
      },
      "hour": "19",
      "day": "3"
    },
    {
      "0": {
        "id": 117,
        "name": "TRX",
        "quota": 8,
        "course_date": "2015-09-03T20:00:00+0000",
        "studio": {
          "id": 2,
          "name": "Stüdyo 2"
        },
        "trainer": {
          "id": 1,
          "name": "-"
        }
      },
      "hour": "20",
      "day": "3"
    },
    {
      "0": {
        "id": 142,
        "name": "Pilates",
        "quota": 8,
        "course_date": "2015-09-04T12:15:00+0000",
        "studio": {
          "id": 2,
          "name": "Stüdyo 2"
        },
        "trainer": {
          "id": 1,
          "name": "-"
        }
      },
      "hour": "12",
      "day": "4"
    },
    {
      "0": {
        "id": 141,
        "name": "Crunch 30 Min.",
        "quota": 8,
        "course_date": "2015-09-04T19:30:00+0000",
        "studio": {
          "id": 2,
          "name": "Stüdyo 2"
        },
        "trainer": {
          "id": 1,
          "name": "-"
        }
      },
      "hour": "19",
      "day": "4"
    },
    {
      "0": {
        "id": 130,
        "name": "Crunch 30 Min.",
        "quota": 8,
        "course_date": "2015-09-05T14:00:00+0000",
        "studio": {
          "id": 2,
          "name": "Stüdyo 2"
        },
        "trainer": {
          "id": 1,
          "name": "-"
        }
      },
      "hour": "14",
      "day": "5"
    }
  ]
}

我想我现在很接近了。但一定是这样的;

DAY
    HOUR
    HOUR
DAY
    HOUR
    HOUR

最佳答案

要获取可视示例表,请使用:

WEEKDAY(date)

Returns the weekday index for date (0 = Monday, 1 = Tuesday, … 6 = Sunday

select hour(date), -- group by hour
case when weekday(date)=0 then course_name else null end as Monday, -- 1 col for each weekday
.....
case when weekday(date)=6 then course_name else null end as Sunday

from table 
where -- select a monday to sunday calendar week unique by year 
date(date) - interval weekday(date)=date(curdate()) - interval weekday(curdate())
group by hour(date)

要获得您提到的其他变体:

select right(date, 2), -- day of month,
hour(date) --hour,
course_name
from table
group by 1,2

关于php - 如何生成周表并按天和小时拆分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32397140/

相关文章:

java - Apache James 2.3.2 不会写入 MySQL

mysql - MySQL 中的深度优先搜索

php - 将帖子计为类别 PHP 和 MYSQL

php - 是否有任何函数可以在不声明值的情况下检查值(仅 0.25 步)?

php - 如何管理多标签/多分类文章/帖子的数据库和查询

mysql - Go如何与MySQL连接保存数据并再次渲染?

php - getUser() 返回 null, session 未在我的 symfony Controller 中启动

php - 通过 KnpPaginatorBundle 使用多个模板

symfony - 如何强制 symfony 的 phpunit 桥使用 phpunit 6.5 而不是 5.7?

php - 为什么当目录在主目录中时禁止 apache 抛出?