如何在My SQL中按日计算

时间:2017-01-20 10:08:26

标签: mysql sql innodb

此表包含按时间戳列出的订单计数:

订单

id, created_at, items
1, 1484827200, 5
2, 1484830800, 10
3, 1484913600, 10

//如何按天计算物品数量? 类似的东西:

2016-01-19, 15
2016-01-20, 10

我的疑问:

SELECT sum(items)
FROM orders
GROUP BY EXTRACT(DAY_HOUR FROM created_at)

不正确。

SELECT day(from_unixtime(created_at)), sum(items)
FROM orders
GROUP BY day (from_unixtime(created_at))

太慢了。

5 个答案:

答案 0 :(得分:1)

1。添加一个名为“Day”的字符串列,该列也被编入索引

理想情况下,您应该包含日期列,并更新所有行。将您的日期时间存储为unixtimestamp并每次转换它们会导致以下问题:

  • 您必须为每一行运行from_unixtime,然后提取当天。
  • 您正在牺牲任何可以使用索引列正常工作的优化。 Unix timestampsnumbers,与日期相比,基本上是苹果到橙子。

因此,如果此查询很重要,我只需添加day列,并将日期与时间戳一起保存以获得最大速度。同时为您的日期列编制索引。

2。实验

  • 尝试使用别名表,然后执行分组。我有一种感觉,优化器以这样一种方式优化,它可能没有区别,但你可能会运行from_unixtime 2次而不是一次(这需要检查):

    选择   天,   SUM(项目) FROM(选择   DAY(from_unixtime(created_at))AS日,   项目 来自订单)AS临时 GROUP BY temp.day

我不确定from_unixtime中是否再次运行group by转换。

答案 1 :(得分:1)

如果您想要按小时计算总和,请使用此查询

 SELECT id,created_at,SUM(items) FROM orders GROUP BY HOUR(FROM_UNIXTIME(created_at));

如果你想按日期求和

 SELECT id,created_at,SUM(items) FROM orders GROUP BY DATE(FROM_UNIXTIME(created_at));

答案 2 :(得分:0)

我找到了一个可以帮助您的问题:How can I convert bigint (UNIX timestamp) to datetime in SQL Server?

答案中的解决方案之一

Select
dateadd(S, [unixtime], '1970-01-01')
From [Table]

将unixtime更改为时间戳。 它可能会更快。

答案 3 :(得分:0)

我喜欢在GROUP BY LEFT(datetime, 13)上做变种。该表达式返回一个可排序/可分组的字符串,适用于date + hour:

+---------------------+-----------------+
| NOW()               | LEFT(NOW(), 13) |
+---------------------+-----------------+
| 2017-01-20 14:44:42 | 2017-01-20 14   |
+---------------------+-----------------+

当然,如前所述,您需要先从unixtime转换。

答案 4 :(得分:-1)

也许这可以帮到你。

SELECT COUNT(*) FROM TABLE t GROUP BY DATE(t.createddatetime)