【问题标题】:php get date -1 monthphp获取日期-1个月
【发布时间】:2012-03-28 15:56:41
【问题描述】:

所以情况就是这样。在我的数据库表中,我有一个名为 expire_date 的列,我在其中为每一行放置了一个特定的日期。 例如,到期日期是 28-04-2012

我需要一个 php 代码,该代码将通过电子邮件向某个用户发送通知,指出在该日期到期的某件事是 1 个月后到期。因此,如果今天是 2012 年 3 月 28 日,则意味着该事物到期前只有 1 个月。 我没有为此编写任何代码,因为我不知道如何解决 -1 个月。

【问题讨论】:

    标签: php mysql


    【解决方案1】:
    echo strtotime("-1 day"); //1332864156
    echo date("y-m-d",strtotime("-1 day")); // 12-03-27
    

    http://us2.php.net/manual/en/function.strtotime.php

    【讨论】:

      【解决方案2】:

      先用php获取一个月内的日期:

      $myDate = date("Y-m-d", strtotime( date( "Y-m-d", strtotime( date("Y-m-d") ) ) . "+1 month" ) );
      

      然后你可以做一个选择:

      $result = mysql_query( 'SELECT * FROM myTable WHERE expire_date BETWEEN NOW AND "' . $myDate . '"' );
      

      您有一个数组,其中包含在不到一个月内到期的所有项目。 如果你想要那些在 1 个月内到期的:

      $result = mysql_query( 'SELECT * FROM myTable WHERE expire_date = "' . $myDate . '"' );
      

      希望对你有帮助

      【讨论】:

      • @Tales 你实际上应该能够使用少 1 个 date() 函数获得相同的日期,例如:date('Y-m-d', strtotime(date('Y-m-d') . ' +1 month'));
      • @Tales 其实我猜只是echo date('Y-m-d', strtotime('+1 month')); 对吧?
      【解决方案3】:

      简单;

          $WeekAgo = strtotime("-1 week"); //A week before today
          $MonthAgo = strtotime("-1 month"); //A month before today
      

      【讨论】:

        【解决方案4】:

        我很惊讶这里缺少这个答案:

        $oneMonthAgo = new \DateTime('1 month ago');
        echo $oneMonthAgo->format('Y-m-d');
        

        今天是2019-01-28。上面的代码输出2018-12-28

        在这里可以玩:http://sandbox.onlinephpfunctions.com/code/ad457f441719c6b9f68dc646445aac86a3f7f7a0

        【讨论】:

        • 谢谢约翰,这是 imo 的最佳答案。
        【解决方案5】:

        也许你应该在 SQL 而不是 PHP 中这样做?

        如果你想用 PHP 做,这里有一个比@Expert 想要的更简洁的方法

        $date = new DateTime();//now 
        $interval = new DateInterval('P1M');// P[eriod] 1 M[onth]
        $date->sub($interval);
        echo $date->format('Y-m-d');     
        

        【讨论】:

          【解决方案6】:

          正如@Mikhail 所指出的,您应该使用=,以便您只检索一次记录。您不希望在 expire_date 之前的整个月中每天都向您的用户发送垃圾邮件 -

          SELECT *
          FROM tbl
          WHERE expire_date = CURRENT_DATE + INTERVAL 1 MONTH
          

          如果您的 expire_date 包含 DATETIME 而不是 DATE 值,您应该使用类似 -

          SELECT *
          FROM tbl
          WHERE expire_date BETWEEN (CURRENT_DATE + INTERVAL 1 MONTH) AND (CURRENT_DATE + INTERVAL 1 MONTH + INTERVAL 1 DAY - INTERVAL 1 SECOND)
          

          【讨论】:

            【解决方案7】:
            SELECT user, email FROM tbl WHERE expire_date = CURRENT_TIMESTAMP - INTERVAL 1 MONTH
            

            请注意,我使用= 并且不少于,因为如果您只比较它不到一个月,那么您将在上个月每天向用户发送电子邮件。

            【讨论】:

            • 这会选择一个月前过期的记录。
            【解决方案8】:

            您可以在 MySQL 查询中使用 ADDDATE() 函数。

            > SELECT ADDDATE(  '28-03-2012', INTERVAL 1 MONTH )
            28-04-2012
            

            更多信息here

            如果您的expire_date 列上有索引,如果您使用WHERE 语句查询条目,这可以很快完成,例如:

            WHERE expire_date = ADDDATE(CURDATE(), INTERVAL 1 MONTH)
            

            (更多关于CURDATE()here

            如果您每天只执行一次,它最多只会选择所有人一次,并且不会向他们发送两次电子邮件,因为它只会选择那些距离过期日期正好 1 个月的人。

            当然,如果您在 MySQL 表中使用 DATE 字段类型,则无需额外关心日期的具体表示即可。

            【讨论】:

              【解决方案9】:

              如何在 php 中获取前一个月的日期

              <?php
                $d = strtotime("-1 Months");
                echo date("Y-m-d h:i:sa", $d);
              ?>
              

              【讨论】:

                【解决方案10】:

                您可能需要将日期字符串转换为 unix 时间,然后执行选择 datediff。 (我假设你正在使用 sql)。

                SELECT * FROM table WHERE (SELECT datediff(now(),your-date-in-unixtime) > 30)
                

                【讨论】:

                • 你应该避免在你试图过滤的字段上使用函数,因为它会使索引不可用。
                【解决方案11】:

                对于 SQL,您可以使用以下查询

                SELECT *
                FROM   tablename
                WHERE  DATE_FORMAT(created_at, '%Y/%m/%d') = (CURDATE() + INTERVAL 1 MONTH)
                

                【讨论】:

                • 您应该始终避免这样做。在要过滤的 DATE/DATETIME 字段上使用 DATE_FORMAT() 将使任何索引都无用。
                猜你喜欢
                • 2010-10-24
                • 2017-06-08
                • 2018-09-30
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多