2

我正在尝试使用以下方法选择当前月份的记录:

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

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

4

4 回答 4

11

目前尚不完全清楚这是您的意图,但似乎很可能,因此我将作为答案做出贡献:

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

SELECT * FROM postdata     
WHERE 
  MONTH(postdate) = MONTH(CURDATE())
  AND YEAR(postdate) = YEAR(CURDATE())
ORDER BY postdate DESC 
于 2012-06-30T21:20:37.167 回答
2

ORDER BY必须在WHERE子句之后:

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

可以这样想:

  • “获取”表中的所有行
  • 过滤那些行WHERE
  • 然后对过滤后的结果集进行排序。

文档(精简)中,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 
于 2012-06-30T21:17:58.487 回答
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') 
于 2015-08-12T07:51:10.393 回答
0

尝试这个 ::

    SELECT * FROM postdata 
      WHERE MONTH(postdate) = MONTH(CURRENT_DATE) 
    YEAR(postdate) = YEAR(CURRENT_DATE)
ORDER BY postdate DESC 
于 2012-06-30T21:13:32.257 回答