【问题标题】:MySQL count elements and group by date, ignore timeMySQL计数元素并按日期分组,忽略时间
【发布时间】:2020-03-09 00:54:37
【问题描述】:

我有一个存储付款交易的表格。它们以这种方式与日期时间一起存储:

day-month-year hour:min:sec (Example: 18-11-2019 11:54:41)

我想计算每天有多少交易。

如果我使用这个查询:

SELECT COUNT(id), paid FROM `payments` WHERE paid IS NOT NULL GROUP BY paid

它会返回每一行,但我想按日期分组,忽略时间。

【问题讨论】:

  • @CherryDT 没有任何效果,可能是因为我的日期格式是欧洲的?
  • 您说它是“与日期时间一起存储” - 我假设您的意思是它是 DATETIME 列,那么您只需使用 GROUP BY DATE(paid)
  • 使用适合数据的数据类型存储数据

标签: php mysql datetime


【解决方案1】:

如果您的列在一个实际的DATETIME 中,DATE 函数应该这样做:

SELECT COUNT(id), paid FROM `payments` WHERE paid IS NOT NULL GROUP BY DATE(paid)

如果它是具有自定义格式的VARCHARTEXT,例如您指定的示例 (18-11-2019 11:54:41),您需要先使用STR_TO_DATE 对其进行解析:

SELECT COUNT(id), paid FROM `payments` WHERE paid IS NOT NULL GROUP BY DATE(STR_TO_DATE(paid, '%d-%m-%Y %H:%i:%s'))

【讨论】:

  • 显然,它不是日期时间列
【解决方案2】:

您应该始终使用DATETIME 列格式来存储日期,而不是VARCHAR。您始终可以在应用程序层处理表示问题(例如转换为欧洲格式)。如果是这种情况,您可以简单地 GROUP BY DATE(paid)

SELECT COUNT(id), paid 
FROM `payments` 
WHERE paid IS NOT NULL 
GROUP BY DATE(paid)

如果您的列是VARCHARTEXT,您需要将其转换为您可以分组的值。如果格式为DD-MM-YYYY,您可以简单地使用LEFT(paid, 10) 提取日期部分并按其分组,即

SELECT COUNT(id), paid 
FROM `payments` 
WHERE paid IS NOT NULL 
GROUP BY LEFT(paid, 10)

如果您的日期存储为D-M-YYYY,则需要使用STR_TO_DATE 进行转换,例如

SELECT COUNT(id), paid 
FROM `payments` 
WHERE paid IS NOT NULL 
GROUP BY STR_TO_DATE(paid, '%e-%c-%Y')

请注意,您可以在转换时忽略值的时间部分,从而避免使用 DATE 函数。

【讨论】:

  • @GiovanniPalerma 为什么改变主意接受?
猜你喜欢
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-23
  • 2018-01-25
  • 1970-01-01
  • 2018-05-01
相关资源
最近更新 更多