2016-09-18 54 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