【问题标题】:MySQL select all rows from last month until (now() - 1 month), for comparative purposesMySQL 选择从上个月到(现在() - 1 个月)的所有行,用于比较目的
【发布时间】:2011-08-29 05:05:12
【问题描述】:

我需要一些帮助来编写一个 MySQL 查询来显示上个月的行,但不是整个月,只是直到现在()的同一天、小时和分钟,但 1 个月前。

例如,如果今天是 5 月 19 日下午 5 点 25 分,我需要选择从 4 月 1 日午夜 12:00 到 4 月 19 日下午 5:25 的行(当然也是同年)。

谢谢!

【问题讨论】:

    标签: mysql datetime


    【解决方案1】:

    您可以通过计算前一个月的 last_day 并添加一天来获得该月的第一天。这很尴尬,但我认为这比将日期格式化为字符串并用于计算要好。

    select 
      *
    from
      yourtable t
    where
      /* Greater or equal to the start of last month */
      t.date >= DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 2 MONTH)), INTERVAL 1 DAY) and
      /* Smaller or equal than one month ago */
      t.date <= DATE_SUB(NOW(), INTERVAL 1 MONTH)
    

    【讨论】:

    • +1 无需字符串转换即可检索上个月第一天的好方法
    • +1 非常好....我使用了SET @FirstDayLastMonth = (DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 2 MONTH)), INTERVAL 1 DAY));,然后使用了SET @LastDayLastMonth = (LAST_Day(@FirstDayLastMonth));,因为我需要获取上个月的第一天和最后一天。非常感谢 GolezTrol!!!
    【解决方案2】:

    只需一个 MySQL 函数即可轻松获取一个月前的数据:

    SELECT DATE_SUB(NOW(), INTERVAL 1 MONTH);
    

    SELECT NOW() - INTERVAL 1 MONTH;
    

    在我的脑海中,我想不出在 MySQL 中获得上个月第一天的优雅方法,但这肯定会奏效:

    SELECT CONCAT(LEFT(NOW() - INTERVAL 1 MONTH,7),'-01');
    

    将它们放在一起,您就会得到一个可以解决您的问题的查询:

    SELECT *
    FROM your_table
    WHERE t >= CONCAT(LEFT(NOW() - INTERVAL 1 MONTH,7),'-01')
    AND t <= NOW() - INTERVAL 1 MONTH
    

    【讨论】:

      【解决方案3】:

      简单代码请查收

      SELECT * FROM table_name WHERE created >= (NOW() - INTERVAL 1 MONTH)
      

      【讨论】:

      • 不应该大于等于吗? SELECT * FROM table_name WHERE created &gt;= (NOW() - INTERVAL 1 MONTH)?
      • 尽管与正确答案完全相反,怎么可能获得如此多的赞成票?有人请澄清这背后的巫术! (编辑答案)
      【解决方案4】:

      这是与您的问题相关的 MySQL 日期操作示例:

      SELECT DATE_ADD( now( ) , INTERVAL -1 MONTH ) 
      

      以上将返回一个月前的日期时间

      所以,你可以使用它,如下:

      SELECT * 
      FROM your_table 
      WHERE Your_Date_Column BETWEEN '2011-01-04' 
          AND DATE_ADD(NOW( ), INTERVAL -1 MONTH )
      

      【讨论】:

        【解决方案5】:
        SELECT
             * 
        FROM 
             <table_name> 
        WHERE 
             <date_field> BETWEEN DATE_SUB(NOW(), INTERVAL 1 MONTH) AND NOW();
        

        同样,您可以选择 1 个月、2 个月等的记录。

        【讨论】:

          【解决方案6】:
          SELECT * 
          FROM table 
          WHERE date BETWEEN 
              ADDDATE(LAST_DAY(DATE_SUB(NOW(),INTERVAL 2 MONTH)), INTERVAL 1 DAY) 
              AND DATE_SUB(NOW(),INTERVAL 1 MONTH);
          

          有关DATE_SUBADDDATELAST_DAY 和其他有用的日期时间函数的信息,请参阅the docs

          【讨论】:

            【解决方案7】:

            您可以使用WHERE 子句,例如:

            WHERE DateColumn BETWEEN
                CAST(date_format(date_sub(NOW(), INTERVAL 1 MONTH),'%Y-%m-01') AS date)
                AND
                date_sub(now(), INTERVAL 1 MONTH)
            

            【讨论】:

              【解决方案8】:
              SELECT *
              FROM table
              WHERE myDtate BETWEEN now()
                  , DATE_SUB(NOW()
                  , INTERVAL 1 MONTH)
              

              【讨论】:

                【解决方案9】:

                我的解决方案是在用您的编程语言编写 sql 时避免使用NOW(),并用字符串替换。正如您所指出的,NOW() 的问题在于它包括当前时间。所以要从查询日的开始(0小时和分钟)开始捕获,而不是:

                r.date <= DATE_SUB(NOW(), INTERVAL 99 DAY)
                

                我做了(php):

                $current_sql_date = date('Y-m-d 00:00:00');
                

                在sql中:

                $sql_x = "r.date <= DATE_SUB('$current_sql_date', INTERVAL 99 DAY)"
                

                这样,您将从指定日期的午夜开始检索数据

                【讨论】:

                • 您可以尝试在当天使用类似的内容SELECT DAY(NOW());,在昨天使用类似的内容SELECT DAY(NOW() - INTERVAL 1 DAY);
                【解决方案10】:

                也许像这样 - 整个上个月 DATE(recDate) BETWEEN DATE_ADD(LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 2 MONTH)), INTERVAL 1 DAY) AND LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 1 MONTH))

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-11-29
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多