【问题标题】:SQL - Check which years contain dataSQL - 检查哪些年份包含数据
【发布时间】:2009-10-11 03:25:31
【问题描述】:

如何从 mysql 数据库中只选择年份(但只选择包含数据的年份)?

PHP time() function 用于在数据库中填充日期。自 2006 年以来存储了超过 10,000 条记录...

我想按日期对数据进行分类(首先,用户选择年,然后是月,然后是日...)。我还希望能够使用类似的方法按月和/或天进行选择。

【问题讨论】:

  • 我编辑了帖子...在数据库中存储了 php time() 函数的值,而不是 mysql time() (我不知道它存在:))
  • 我的这个替代解决方案并不完美,因为您必须注意闰年,这会使情况复杂化

标签: sql mysql


【解决方案1】:

有一些 MySQL 函数可以从日期中提取年/月/日信息,但它们适用于 MySQL 的日期类型。因此,首先您需要使用FROM_UNIXTIME(date) 将您的UNIX 时间戳转换为日期,然后提取您想要的部分信息。有关可用日期函数的列表,请参阅docs。因此,例如要获取所有年份,您可以使用:

SELECT DISTINCT YEAR(FROM_UNIXTIME(date)) FORM table;

如果您想稍后过滤实际结果,可以使用它来获取 2009 年的所有行:

SELECT ... WHERE YEAR(FROM_UNIXTIME(date)) = 2009

除非您有充分的理由将时间戳存储在数据库中,否则我建议将该列转换为 MySQL 的 datetime 类型。这将允许您使用索引来加快查询速度。 MySQL 无法使用特定函数创建索引,因此您不能在查询中使用YEAR(),但可以这样做,例如:

SELECT ... WHERE date >= 2009 AND date <= 2009;

【讨论】:

  • 不幸的是,我无法转换当前的日期类型,因为它是一个非常复杂的门户,更改它会很困难。我会想出一些其他的解决方案,但将来我会记住这个解决方案。非常感谢!
  • 我刚刚编辑了我的帖子,如果我们考虑到我在 mysql 中使用 UNIX 时间戳作为日期格式,我认为这是最好的解决方案
  • 我真的不明白这比SELECT DISTINCT YEAR(FROM_UNIXTIME(date)) FORM table 更好。
  • 我不能使用你建议的这个解决方案,因为存储在我的数据库中的时间格式不是 mysql 日期格式,而是 UNIX 时间戳。或者我甚至可以使用 unix 时间戳?
  • FROM_UNIXTIME(date) 的重点是将日期从 UNIX 时间戳转换为常规日期时间。
【解决方案2】:

如何从 mysql 数据库中只选择年份(但只选择包含数据的年份)?

SELECT  DISTINCT(YEAR(datecolumn))
FROM    mytable

我想按日期对数据进行分类(首先,用户选择年,然后是月,然后是日...)。我还希望能够使用类似的方法按月和/或天进行选择。

SELECT  DISTINCT(MONTH(datecolumn))
FROM    mytable
WHERE   datecolumn >= CAST(CONCAT($year, '-01-01') AS DATETIME)
        AND datecolumn < CAST(CONCAT($year + 1, '-01-01') AS DATETIME)


SELECT  DISTINCT(DAY(datecolumn))
FROM    mytable
WHERE   datecolumn >= CAST(CONCAT_WS('-', $year, $month, '01') AS DATETIME)
        AND datecolumn < CAST(CONCAT_WS('-', $year, $month, '01') AS DATETIME) + INTERVAL 1 MONTH

如果您将 PHP time() 返回的内容存储在您的列中,请使用:

SELECT  DISTINCT(YEAR(FROM_UNIXTIME(datecolumn)))
FROM    mytable

SELECT  DISTINCT(MONTH(FROM_UNIXTIME(datecolumn)))
FROM    mytable
WHERE   datecolumn >= CAST(CONCAT($year, '-01-01') AS DATETIME)
        AND datecolumn < CAST(CONCAT($year + 1, '-01-01') AS DATETIME)

SELECT  DISTINCT(DAY(FROM_UNIXTIME(datecolumn)))
FROM    mytable
WHERE   datecolumn >= UNIX_TIMESTAMP(CAST(CONCAT_WS('-', $year, $month, '01') AS DATETIME))
        AND datecolumn < UNIX_TIMESTAMP(CAST(CONCAT_WS('-', $year, $month, '01') AS DATETIME) + INTERVAL 1 MONTH)

注意我们这里使用的条件是sargabledatecolumn是表达式一侧唯一的东西,可以使用索引来搜索它。

【讨论】:

    【解决方案3】:

    我认为你想要的 sql 在下面。我在存储为 mysql 日期的数据上测试了这些语句,但 from_unixtime 应该进行转换,以便其余部分按您的意愿工作。

    -- Get year and counts
    SELECT DATE_FORMAT(FROM_UNIXTIME(the_date), '%Y') AS raw_date,
           DATE_FORMAT(FROM_UNIXTIME(the_date), '%Y') AS format_date,
           COUNT(FROM_UNIXTIME(the_date)) AS num_activities
      FROM date_table
     GROUP BY DATE_FORMAT(FROM_UNIXTIME(the_date), '%Y'),
              DATE_FORMAT(FROM_UNIXTIME(the_date), '%Y');
    
    -- Get month/year and counts     
    SELECT DATE_FORMAT(FROM_UNIXTIME(the_date), '%Y%m') AS raw_date,
           DATE_FORMAT(FROM_UNIXTIME(the_date), '%M %Y') AS format_date,
           COUNT(FROM_UNIXTIME(the_date)) AS num_activities
      FROM date_table
     GROUP BY DATE_FORMAT(FROM_UNIXTIME(the_date), '%Y%m'),
              DATE_FORMAT(FROM_UNIXTIME(the_date), '%M %Y');
    
    -- Get date and counts
    SELECT DATE_FORMAT(FROM_UNIXTIME(the_date), '%Y%m%d') AS raw_date,
           DATE_FORMAT(FROM_UNIXTIME(the_date), '%M %d, %Y') AS format_date,
           COUNT(FROM_UNIXTIME(the_date)) AS num_activities
      FROM date_table
     GROUP BY DATE_FORMAT(FROM_UNIXTIME(the_date), '%Y%m%d'),
              DATE_FORMAT(FROM_UNIXTIME(the_date), '%M %d, %Y');
    

    【讨论】:

      【解决方案4】:

      【讨论】:

      • 我编辑了我的答案...我不知道这个提取函数是否可以处理 php time() 的格式(11 位数字)
      猜你喜欢
      • 2021-10-20
      • 1970-01-01
      • 2014-04-04
      • 1970-01-01
      • 2018-04-29
      • 2022-11-10
      • 2020-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多