此表包含按时间戳列出的订单计数:
订单
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))
太慢了。
答案 0 :(得分:1)
理想情况下,您应该包含日期列,并更新所有行。将您的日期时间存储为unixtimestamp并每次转换它们会导致以下问题:
timestamps
是numbers
,与日期相比,基本上是苹果到橙子。因此,如果此查询很重要,我只需添加day
列,并将日期与时间戳一起保存以获得最大速度。同时为您的日期列编制索引。
尝试使用别名表,然后执行分组。我有一种感觉,优化器以这样一种方式优化,它可能没有区别,但你可能会运行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)