【问题标题】:YEAR(AVG(UNIX(date))) different from ROUND(AVG(YEAR(date)))YEAR(AVG(UNIX(date))) 不同于 ROUND(AVG(YEAR(date)))
【发布时间】: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


【解决方案1】:

您的数据似乎包含早于1970-01-01 的日期。 UNIX_TIMESTAMP() 函数对于早于纪元的日期返回 0:

SELECT UNIX_TIMESTAMP('1969-12-31')
-- 0

因此,第一次查询的结果是有偏差的,因为它没有正确计算

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    相关资源
    最近更新 更多