SQL - 检查哪些年份包含数据

时间:2009-10-10 14:33:12

标签: sql mysql

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

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

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

4 个答案:

答案 0 :(得分:3)

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;

答案 1 :(得分: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)

请注意,我们在这里使用的条件是 sargable datecolumn是表达式一侧的唯一内容,并且可以使用索引来搜索它。

答案 2 :(得分:1)

我认为你想要的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');

答案 3 :(得分:0)