MySQL如何从日期中获取月份

28

我希望能够通过类似于这样的语句从mysql中获取结果:

SELECT * 
  FROM table 
 WHERE amount > 1000 

但我想根据用户输入的月份和年份限制结果... 我尝试了这样的方式:

SELECT * 
  FROM table 
 WHERE amount > 1000 
   AND dateStart = MONTH('$m')   

...$m代表一个月份,但是出现了错误。

在那个表格中,它实际上有两个日期:startDateendDate,但我只关注startDate。输入值将是月份和年份。如何构造SQL语句以根据该年份的该月份获得结果?


3
计算机很蠢,即使你的意图对人类来说很清晰也没关系。 - Corey
7个回答

44
你接近了答案,但是比较方向反了(假设startDate是DATETIME或TIMESTAMP数据类型):
SELECT * 
  FROM table 
 WHERE amount > 1000 
   AND MONTH(dateStart) = {$m}

注意事项:


备选方案:


因为在列上使用函数无法使用索引,更好的方法是使用 BETWEENSTR_TO_DATE 函数:

WHERE startdate BETWEEN STR_TO_DATE([start_date], [format]) 
                    AND STR_TO_DATE([end_date], [format])

请参阅格式语法的文档。

参考资料:



8
使用month()函数。
select month(now());

1
我没有给你点踩,但是原样回答几乎没有为问题提供任何帮助。 - OMG Ponies

3
例如。
$date = sprintf("'%04d-%02d-01'", $year, $month);
$query = "
  SELECT
    x,y,dateStart
  FROM
    tablename
  WHERE
    AND amount > 1000
    AND dateStart >= $date
    AND dateStart < $date+Interval 1 month
";
mysql_query($query, ...

这将创建一个类似于以下的查询:
WHERE
  AND amount > 1000
  AND dateStart >= '2010-01-01'
  AND dateStart < '2010-01-01'+Interval 1 month

+ Interval 1 monthdate_add() 的替代方法。

SELECT Date('2010-01-01'+Interval 1 month)-> 2010-02-01
SELECT Date('2010-12-01'+Interval 1 month)-> 2011-01-01
这样,您总是可以得到下个月的第一天。您想要的记录必须具有在该日期之前但在/等于您传递给sprintf()的该月(和年)的第一天之后的dateStart。
'2010-01-01'+Interval 1 month在行之间不会更改。MySQL只会计算一次,并且可以利用索引进行搜索。


3

试试这个:

SELECT * 
FROM table 
WHERE amount > 1000 AND MONTH(dateStart) = MONTH('$m') AND YEAR(dateStart) = YEAR('$m')

0

试试这个

SELECT * 
      FROM table 
     WHERE amount > 1000 
       AND MONTH(datestart)
    GROUP BY EXTRACT(YEAR_MONTH FROM datestart)

0

如果日期字段是文本,则尝试将此字符串转换为日期:

SELECT * FROM `table_name` WHERE MONTH(STR_TO_DATE(date,'%d/%m/%Y'))='11'

//This will give month number MONTH(STR_TO_DATE(date,'%d/%m/%Y'))
//If its return 11 then its November
// Change date format with your date string format  %d/%m/%Y

0

适用于:MySQL 5.7、MySQL 5.6、MySQL 5.5、MySQL 5.1、MySQL 5.0、MySQL 4.1、MySQL 4.0、MySQL 3.23

  • 天:

    SELECT EXTRACT(DAY FROM "2017-06-15");
    
  • 月:

    SELECT EXTRACT(MONTH FROM "2017-06-15");
    
  • 年:

    SELECT EXTRACT(YEAR FROM "2017-06-15");
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接