mysql按当前月份查询和排序

时间:2012-06-30 21:11:48

标签: mysql

我正在尝试使用以下选项来选择具有当月的记录:

SELECT * FROM postdata 
ORDER BY postdate DESC 
WHERE MONTH(postdate) = MONTH(CURRENT_DATE)

postdate的日期格式为YYYY-MM-DD(例如2012-06-30),但遗憾的是没有返回任何记录。这是使用的正确MySQL语句吗?

4 个答案:

答案 0 :(得分:11)

目前还不完全清楚这是你的意图,但似乎我会作出回答:

除了ORDER BY不合适之外,您必须比较两个月份和日期。由于函数MONTH()仅返回1到12的数字,因此查询将返回所有年份的6月的所有记录,而不是仅返回当前年份。同时使用MONTH(), YEAR()来比较当前年份的月份。

SELECT * FROM postdata     
WHERE 
  MONTH(postdate) = MONTH(CURDATE())
  AND YEAR(postdate) = YEAR(CURDATE())
ORDER BY postdate DESC 

答案 1 :(得分:2)

ORDER BY必须在WHERE子句之后:

SELECT * FROM postdata 
WHERE MONTH(postdate) = MONTH(CURRENT_DATE)
ORDER BY postdate DESC 

这样想:

  • “获取”表格中的所有行
  • 使用WHERE
  • 过滤这些行
  • 然后订购过滤后的结果集。

the documentation(已剥离),WHERE ORDER BY之前;

SELECT
    ...
    [WHERE where_condition]
    ...
    [ORDER BY {col_name | expr | position}
      [ASC | DESC], ...]
    ...

除了你的OP中的问题,你的逻辑实际上有点缺陷;您需要比较月份日期的年份,否则将选择任何一年中具有相同月份的行。试试这个:

SELECT * FROM postdata 
WHERE 
    MONTH(postdate) = MONTH(NOW())
    AND YEAR(postdate) = YEAR(NOW())
ORDER BY postdate DESC 

答案 2 :(得分:1)

当月

WHERE DATE_FORMAT(date_column ,'%Y-%m') =  DATE_FORMAT(NOW() ,'%Y-%m') 

您想要的月份过滤

WHERE DATE_FORMAT(date_column ,'%Y-%m') =  DATE_FORMAT(NOW() ,'%Y-05') 

答案 3 :(得分:0)

试试这个::

    SELECT * FROM postdata 
      WHERE MONTH(postdate) = MONTH(CURRENT_DATE) 
    YEAR(postdate) = YEAR(CURRENT_DATE)
ORDER BY postdate DESC