【发布时间】:2019-05-02 15:38:08
【问题描述】:
总结一道练习题:
我需要从datetime 列中查询平均年份。我最初的解决方案是YEAR(AVG()) 所有日期。但由于我不能AVG() 和datetime,我将日期转换为unix,然后再转换回日期时间:
SELECT
YEAR(FROM_UNIXTIME(AVG(UNIX_TIMESTAMP(date1))))
FROM table1;
返回1980
正确的查询是:
SELECT
ROUND(AVG(YEAR(date1)))
FROM table1;
返回1960
第二个查询更好,原因很明确,但为什么结果不同?
【问题讨论】:
-
您肯定有
'1970-01-01 00:00:00'之前的日期,因为您的正确平均值是 1960。此时间之前的日期未定义 Unix 时间戳值。 -
"如果将超出范围的日期传递给 UNIX_TIMESTAMP(),它将返回 0。值的有效范围与 TIMESTAMP 数据类型相同:'1970-01-01 00 :00:01.000000' UTC 到 '2038-01-19 03:14:07.999999' UTC。" 参考:dev.mysql.com/doc/refman/5.5/en/…
-
即使没有 1970 年之前的日期,您的第一个查询也是计算平均秒数(不同的时间单位);而第二个查询正在计算年的平均值(另一个时间单位)。你不能指望他们给出同样的结果。
标签: mysql sql datetime unix-timestamp