【问题标题】:Group rows by days specifying time按指定时间的天数对行进行分组
【发布时间】:2020-07-18 09:33:18
【问题描述】:

我正在尝试按整个工作日和付款方式类型(卡、现金、条纹..)对付款表进行分组。事情是(而且我无法完成)工作日并不意味着从 00:00 到 00:00,而是它是用户输入值(通常是 08:00。我强制 08:00现在查询)。这是因为酒吧/餐厅从 00:00 到 00:00 不营业,但通常在凌晨 3 点或 4 点关门。我还想按日期排序结果(我已经这样做了)。

这是我目前得到的查询:

select * from (select SUM(value) as total, `currency`, `payment_method_type_id`, DATE_FORMAT(created_at, "%Y-%m-%d 08:00:00") as day from payments group by payment_method_type_id, DATE_FORMAT(created_at, "%Y-%m-%d 08:00:00"), currency) as ipd order by day desc

但结果不正确,因为分组时没有考虑时间。我想从昨天 08:00 到今天 08:00。

Here 对 DB Schema 和一些插入很感兴趣。

非常感谢,

【问题讨论】:

  • 当您在查询中指定 DATE_FORMAT(created_at, "%Y-%m-%d 08:00:00") as day 时,您认为 mysql 应该如何“考虑”时间?
  • 这是一个例子,避免使用vars
  • Time is not taken into account,你的意思是说你想要从昨天 08:00 到今天 08:00 分组的东西。如果是这样,请更改您的查询。
  • 我们对“最小”一词有不同的解释
  • 我不同意;我见过其中的一些。您提供的大约一千行中没有任何内容无法在 12 中解释。

标签: mysql group-by mariadb


【解决方案1】:

要解决问题,请在更改为日期之前减去 8。

并且可以简化为

        SELECT  SUM(value) as total, `currency`, `payment_method_type_id`,
                DATE(created_at - INTERVAL 8 HOUR) as day
            from  payments
            group by  payment_method_type_id, day, currency
            order by  day desc 

也许您希望ORDER BY 列表与GROUP BY 列表匹配?

【讨论】:

  • 谢谢!看起来这个查询对行进行了正确的分组:)
  • 如果您使用DATETIME,可能会在日光/标准时间变化时给您带来麻烦。
  • created_at 是带有 UTC 值的时间戳
猜你喜欢
  • 2017-08-17
  • 2021-04-29
  • 2021-07-07
  • 2020-09-21
  • 2022-12-05
  • 1970-01-01
  • 2021-07-25
  • 2019-11-12
  • 1970-01-01
相关资源
最近更新 更多