【问题标题】:How do I get a list of month names from two date columns?如何从两个日期列中获取月份名称列表?
【发布时间】:2021-07-01 03:46:43
【问题描述】:

表格示例:

ID StartDate EndDate
1 2021-01-01 2021-04-01
2 2021-03-01 2021-05-01

如何获取两个日期列之间的月份名称列表作为范围? 比如:

|ID| Months |
|--|--------|
|1 | January|
|1 | Febuary|
|1 | March  |
|1 | April  |
|2 | March  |
|2 | April  |
|2 | May    |

我发现的大多数示例都是从一列中手动输入日期的。我试过monthname(), datediff() 但diff只计算差异而不列出它们

【问题讨论】:

  • 为什么要让mysql来处理这种进程?
  • 因为我想用月份名来过滤我的php中的一些数据
  • 为什么不让php处理呢?
  • 如何建立一个这样的参考表:1月21日:2021-01-01,2021-01-31这样您可以轻松比较范围
  • @lvil 那会很丑。我建议让 php 处理这种数据操作。

标签: mysql


【解决方案1】:

使用 MySQL8.0 你可以这样做:

WITH RECURSIVE cte AS (
  SELECT
    ID,
    MONTH(StartDate) as M,
    MONTHNAME(StartDate) as MonthName,
    1 as X
  FROM fromto
  UNION ALL
  SELECT
    cte.ID,
    MONTH(DATE_ADD(StartDate,INTERVAL X MONTH)),
    MONTHNAME(DATE_ADD(StartDate,INTERVAL X MONTH)),
    X+1
  FROM cte
  INNER JOIN fromto on fromto.ID=cte.ID
  WHERE DATE_ADD(StartDate,INTERVAL X MONTH)<=EndDate
)
SELECT ID,M,MonthName FROM cte order by ID,M;

输出:

+------+------+-----------+
| ID   | M    | MonthName |
+------+------+-----------+
|    1 |    1 | January   |
|    1 |    2 | February  |
|    1 |    3 | March     |
|    1 |    4 | April     |
|    2 |    3 | March     |
|    2 |    4 | April     |
|    2 |    5 | May       |
+------+------+-----------+

上面例子中的表fromto是这样创建的:

CREATE TABLE `fromto` (
  `id` int DEFAULT NULL,
  `startdate` date DEFAULT NULL,
  `enddate` date DEFAULT NULL
);
INSERT INTO `fromto` VALUES (1,'2021-01-01','2021-04-01'),(2,'2021-03-01','2021-05-01');

如果没有WITH(在 MySQL 8.0 之前),可以这样做:

DROP TABLE IF EXISTS counter;
CREATE TABLE counter(i int primary key);
INSERT INTO counter VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12);

SELECT
   id,
   MONTHNAME(DATE_ADD(StartDate,INTERVAL i MONTH))
FROM 
   fromto
CROSS JOIN  counter
WHERE DATE_ADD(StartDate,INTERVAL i MONTH)<=EndDate
ORDER BY id,2;

应将所需的值添加到此counter 表中。

【讨论】:

  • 我知道 With 语句不适用于 myphpadmin。有没有办法可以使用不同的查询来获得相同的结果?
  • With 语句与 myphpadmin 无关。它只与 MySQL 的版本有关。您至少需要 8.0 才能使其工作。
  • 是的,我对此进行了一些研究,似乎我的 myphpadmin 使用 mariadb,我尝试将其更改为 mysql 8.0,但是当我尝试在 xampp 上启动 mysql 时,错误不断发生。我试图更改端口,但仍然没有运气。是否有教程可以在 xampp 上更改服务器?因为一直出现的错误是“MYSQL shutdown unexpectedly”
  • 你真的应该让 myphpadmin 离开这个讨论。那是一个连接数据库的工具。该数据库可以是 MySQL 或 MariaDB。如果你有 MySQL,使用WITH 应该是 8.0+。或 mariadb,其中 WITH 似乎受版本 10.2.1 的支持
  • 可以找到比较 MySQL 和 MariaDB (sep2020) 的网站here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-08
相关资源
最近更新 更多