【问题标题】:GROUP BY date/month按日期/月份分组
【发布时间】:2018-02-11 06:07:14
【问题描述】:

我有一个包含大量交易的表格,其日期格式如下:-

January 1, 2016
September 9, 2016
September 13, 2016
August 8, 2017
August 9, 2017

当日期在中间时,我将如何将月份和年份组合在一起 - 它们是Varchar

【问题讨论】:

  • 请添加您目前尝试过的内容。
  • 我不知道该怎么做,因为“一天”在中间。我已经尝试过 MySQL 的 EXTRACT() 功能。我想也许你可以爆炸它,但这需要额外的工作查询。
  • @AniketV TO_DATE 是 Oracle 函数,而不是 MySQL 函数。
  • 我的错。应该提到TIMESTAMPSTR_TO_DATE

标签: php mysql


【解决方案1】:

这是一个有点棘手的问题。我们可以通过首先使用STR_TO_DATE 将您的日期字符串转换为真实日期,然后使用DATE_FORMAT 返回字符串以获得用于分组数据的月份和年份来解决此问题。

SELECT
    DATE_FORMAT(STR_TO_DATE(date_col, '%M %e, %Y'), '%Y-%m') AS ym,
    SUM(some_col) AS sum_col
FROM yourTable
GROUP BY
    DATE_FORMAT(STR_TO_DATE(date_col, '%M %e, %Y'), '%Y-%m')

为了获得更好的长期解决方案,请考虑将文本日期存储在某种 MySQL 日期列类型中。另一种选择是将日期存储在数字列中作为纪元以来的秒数。上面的查询,虽然逻辑上可能是正确的,但可能没有机会使用任何索引,所以从性能的角度来看,你应该尽量避免这样的情况。

演示在这里:

Rextester

【讨论】:

  • 非常感谢。我设法让它使用它工作。我只想说 GROUP BY y-m。 :-)
  • @Patrick 但请注意:在大多数 SQL 数据库中,SELECT 子句中定义的别名不可用于 GROUP BY。
  • 感谢您让我知道... :)
【解决方案2】:
GROUP BY DATE_FORMAT(record_date, '%Y%m')

参考Link

【讨论】:

  • 您不能在该日期格式上使用 YEAR SELECT YEAR('January 1, 2016'); 返回 (NULL)
  • 你不能使用 DATE_FORMAT SELECT DATE_FORMAT('January 1, 2016', '%Y%m'); 也返回'(null)'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
  • 2013-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
相关资源
最近更新 更多