2016-09-18 30 views
2

我想使用带集合函数的TO_SECONDS(AVG,COUNT)来总结我的表。但是,结果并不是我所期望的。下面是一个例子表:MariaDB/MySQL TO_SECONDS和AGGREGATE函数

MariaDB [test]> select * from mytable; 
+----+---------------------+------+ 
| id | ts     | val | 
+----+---------------------+------+ 
| 1 | 2016-01-01 01:02:03 | 1 | 
| 2 | 2016-01-01 01:02:04 | 2 | 
| 3 | 2016-01-01 01:02:04 | 3 | 
| 4 | 2016-01-01 01:02:05 | 4 | 
| 5 | 2016-01-01 01:02:05 | 5 | 
+----+---------------------+------+ 

查询#1(OK):

MariaDB [test]> select to_seconds(ts) as tsec from mytable; 
+-------------+ 
| tsec  | 
+-------------+ 
| 63618829323 | 
| 63618829324 | 
| 63618829324 | 
| 63618829325 | 
| 63618829325 | 
+-------------+ 

查询#2(?):

MariaDB [test]> select to_seconds(ts) as tsec, avg(val) mval from mytable group by tsec; 
+------------+------+ 
| tsec  | mval | 
+------------+------+ 
| 2147483647 | 3 | 
+------------+------+ 

预期结果:

+-------------+------+ 
| tsec  | mval | 
+-------------+------+ 
| 63618829323 | 1 | 
| 63618829324 | 2.5 | 
| 63618829325 | 4.5 | 
+-------------+------+ 

SQL小提琴:http://sqlfiddle.com/#!9/17616a/6
MariaDB版本> mysql Ver 15.1 Distrib 10.1.17-MariaDB,Linux(x86_64)使用readline 5.1

当然,我可以使用其他DATE/TIME函数(UNIX_TIMESTAMP等)来执行任务。但是,我想知道为什么结果是不同的。
我错过了什么?我误解了TO_SECONDS的用法吗?

+0

这似乎是一个数据类型问题。返回值被视为一个整数而不是一个大整数。 –

回答

1

这是一个奇怪的数据类型问题。下面做工作:当您使用group by

select cast(to_seconds(ts) as decimal(20, 0)) as tsec, avg(val) 
from mytable 
group by tsec; 

我不知道为什么to_seconds()返回值将是大到足以存储当您选择它的价值,但随后被转换为整数。

+0

谢谢你的快速回答。 – putu