代码之家  ›  专栏  ›  技术社区  ›  netrox

如何在mysql中获取月份起始日期

  •  22
  • netrox  · 技术社区  · 16 年前

    我想用这样的语句从mysql获取结果:

    SELECT * 
      FROM table 
     WHERE amount > 1000 
    

    但我想获取限制在某个月和某个年的结果(基于用户的输入)。我是这样想的:

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

    $m 是一个月,但却犯了错误。

    在那张表中,它实际上有两个日期: startDate endDate 但我专注于 小精灵 . 输入值将是月份和年份。如何表达基于当年那个月得到结果的sql语句?

    7 回复  |  直到 8 年前
        1
  •  37
  •   OMG Ponies    16 年前

    你差一点把比较倒过来(假设 startDate 是日期时间或时间戳数据类型):

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

    Caveats:


    选择:


    因为在列上使用函数不能使用索引,所以更好的方法是使用 BETWEEN 以及 STR_TO_DATE 功能:

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

    有关格式化语法,请参阅文档。

    参考文献:


        2
  •  7
  •   Gattster    16 年前

    使用 month() 功能。

    select month(now());
    
        3
  •  3
  •   Louis    16 年前

    试试这个:

    SELECT * 
    FROM table 
    WHERE amount > 1000 AND MONTH(dateStart) = MONTH('$m') AND YEAR(dateStart) = YEAR('$m')
    
        4
  •  3
  •   VolkerK    16 年前

    例如。

    $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 month 是一个替代品 date_add() .

    SELECT Date('2010-01-01'+Interval 1 month) -gt; 2010-02-01
    SELECT Date('2010-12-01'+Interval 1 month) -gt; 2011-01-01
    这样你总能得到下个月的第一天。您想要的记录必须在该日期之前有一个日期开始,但在/等于您传递给sprintf()的月份(和年份)的第一天之后。
    '2010-01-01'+Interval 1 month 不会在两行之间改变。mysql只计算一次这个词,并且可以使用索引进行搜索。

        5
  •  0
  •   Choxmi    10 年前

    试试这个

    SELECT * 
          FROM table 
         WHERE amount > 1000 
           AND MONTH(datestart)
        GROUP BY EXTRACT(YEAR_MONTH FROM datestart)
    
        6
  •  0
  •   A.Aleem11    9 年前

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

    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
    
        7
  •  0
  •   Bugs Manjeet    8 年前

    工作于: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");