如何从mysql数据库中选择多年(但只包含那些包含数据的年份)?
PHP time() function用于填充数据库中的日期。自2006年以来,存储了超过10,000条记录......
我想按日期对数据进行分类(首先,用户选择年份,然后是月份,而不是白天......)。我也希望能够在几个月和/或几天内使用类似的方法进行选择。
答案 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)