【问题标题】:mysql get month number not relative to the yearmysql获取与年份不相关的月份数
【发布时间】:2016-08-23 16:07:28
【问题描述】:

我需要在过去 3 年中逐月获得结果。这就是我所拥有的:

CREATE DEFINER=`root`@`localhost` PROCEDURE `by_year`()
BEGIN
    DROP TEMPORARY TABLE IF EXISTS  aaa;
    SET @year = 2014;
    WHILE @year <= YEAR(CURDATE()) DO
        CREATE TEMPORARY TABLE IF NOT EXISTS aaa (Año int, Registrados int,  Activos int, Compraron int, Recurrentes int);
        INSERT INTO aaa 
        SELECT @year, registrados.count, activos.count, compraron.count, recurrentes.count FROM

        # Here is my query to get the data. With a WHERE that limits the creation date by @year. [YEAR(AU.created) <= @year] For example

    END WHILE;

    SELECT * FROM aaa;
END

它可以工作多年。但我需要几个月甚至几周甚至几天才能得到结果。

我的问题是,如果我用 MONTH 或 DAY 替换 YEAR 函数,这些函数将返回一个从字面上取自日期的数字(相对于更大的分隔符)

例如来自

MONTH('2015-11-25') 

我明白了

11

所以 MONTH('2015-11-25') 等于 MONTH('2016-11-02')

我看到了两种方法......我找到了一个函数或类似的东西:

MONTH_FROM_THE_BEGGINING_OF_TIMES('2016-11-02')

与 TIME 处理的日期类似,在这种情况下,通常从第 1 年返回月份数,应该类似于 (2015 * 12) + 11 = 24191

另一种方法是使用双 WHILE。然后连续几天三倍。这将产生 O(n^3) 的复杂度,这是不好的。

非常欢迎任何想法。

谢谢

【问题讨论】:

  • 我不明白你在做什么。您是否尝试按月获取过去 3 年的某种总价值?
  • 正确。 @Bill Karwin 给了我答案:D

标签: mysql sql date


【解决方案1】:

您可能喜欢 MySQL 的 EXTRACT() 函数:

mysql> SELECT EXTRACT(YEAR_MONTH FROM CURDATE()) AS YM;
+--------+
| YM     |
+--------+
| 201608 |
+--------+

如果你想要几天,你可能会喜欢TO_DAYS()

mysql> SELECT TO_DAYS(CURDATE()) AS days;
+--------+
| days   |
+--------+
| 736564 |
+--------+

【讨论】:

  • @Alejandro,您为什么不尝试按照我提供的EXTRACT() 函数文档的链接来找出答案! :-)
【解决方案2】:

你不能不替换函数 YEAR,你只需要添加函数 MONTH 以使用逻辑 AND 运算符得到月份的结果。同样在您的查询中以获取数据,您必须在 group by 中添加月份的 AND 部分。
这是获取相对于年份的月份编号的唯一方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多