【问题标题】:Mysql - selecting year from a unix timestampMysql - 从unix时间戳中选择年份
【发布时间】:2010-12-15 02:27:48
【问题描述】:

我正在使用这个:

SELECT FROM_UNIXTIME(my_unix_timestamp_column, '%Y') AS year FROM table_name WHERE year = 2009;

但它给了我一个错误:

Unknown column 'year' in 'where clause'SELECT FROM_UNIXTIME(my_unix_timestamp_column, '%Y') AS year FROM table_name WHERE year = 2009

“my_unix_timestamp_column”和“table_name”都是正确的,我不知道为什么它给了我这个!!!

我使用的是 PHP 5.3.0

【问题讨论】:

    标签: mysql select timestamp


    【解决方案1】:

    另一种选择,避免重复大的函数调用:

    SELECT year
      FROM (SELECT FROM_UNIXTIME(my_unix_timestamp_column, '%Y') AS year
              FROM table_name) AS list_of_years
     WHERE year = 2009;
    

    您可能仍需要在“年份”一词周围使用反引号,以避免与 YEAR 作为关键字发生冲突。优化器不需要创建中间表来回答这个查询。

    【讨论】:

      【解决方案2】:
      SELECT  FROM_UNIXTIME(my_unix_timestamp_column, '%Y') AS `year`
      FROM    table_name
      HAVING  `year` = 2009
      

      WHERE 子句不同,HAVING 子句可以引用SELECT 子句别名。

      更高效的索引方式是:

      SELECT  FROM_UNIXTIME(my_unix_timestamp_column, '%Y') AS `year`
      FROM    table_name
      WHERE   my_unix_timestamp_column >= UNIX_TIMESTAMP('2009-01-01')
              AND my_unix_timestamp_column < UNIX_TIMESTAMP('2010-01-01')
      

      【讨论】:

      • 虽然这两个查询都有效,但这个答案并没有描述为什么两者都解决了 where 子句中的 year 问题。 (与 where 子句中的年份匹配相比,两者的结构都不太正常)
      【解决方案3】:

      我不太确定这是因为YEAR 是 MySQL 中的保留字,还是因为它希望您执行以下操作:

      SELECT
        FROM_UNIXTIME(my_unix_timestamp_column, '%Y') AS year
      FROM
        table_name
      WHERE
        FROM_UNIXTIME(my_unix_timestamp_column, '%Y') = 2009;
      

      不记得最后一个问题是否只与GROUPings 相关:S

      【讨论】:

        【解决方案4】:

        WHERE 部分在字段列表中的别名之前执行。最好的办法是在 WHERE 子句中使用 BETWEEN 以便可以使用索引。

        【讨论】:

          【解决方案5】:

          您不能使用在WHERE 子句中创建SELECT 部分的列

          将 where 子句中的 year 变量替换为创建该列的实际函数(又名 FROM_UNIXTIME(my_unix_timestamp_column, '%Y') ),您应该没问题。

          这是因为在 WHERE 部分完成匹配要返回的行之前,不会执行查询的 SELECT 部分。

          【讨论】:

          • 关于SELECT 部分的部分是错误的。我不会对你投反对票,但请尝试在任何具有从 1 开始的连续 ID 的表上运行以下查询:SET @r := 1; SELECT @r := id + 1 FROM mytable WHERE @r = id
          猜你喜欢
          • 1970-01-01
          • 2013-03-28
          • 1970-01-01
          • 2014-05-25
          • 1970-01-01
          • 2016-02-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多