【问题标题】:How Many Days have occured during a Given Timespan在给定时间跨度内发生了多少天
【发布时间】:2010-12-06 03:06:01
【问题描述】:

如果我们有日期范围,例如:

2009 年 10 月 1 日 - 2009 年 10 月 20 日

我们可以计算一下在这期间发生了多少个星期一

答案是(3)

  M   T   W   T   F   S   S
             *1   2   3   4
  5   6   7   8   9  10  11
 12  13  14  15  16  17  18
 19 *20  21  22  23  24  25
 26  27  28  29  30  31

我们可以在 MySQL 中这样做吗,如果不能在 PHP 中完成,或者我必须创建一个函数

【问题讨论】:

    标签: php sql mysql date


    【解决方案1】:

    或者这个:

    // Pass $date_1, $date_2 as timestamps, $dow as 3-letter abbrev. (e.g. 'Mon').
    // Dates can be low to high or high to low.
    
    function dow_between($date_1, $date_2, $dow)
    {
        if ($date_2 < $date_1) {
            list($date_2, $date_1) = array($date_1, $date_2);
        }
        for ($num_dow = -1; $date_1 <= $date_2; $num_dow++) {
            $date_1 = strtotime('next ' . $dow, $date_1);
        }
        return $num_dow;
    }
    

    已编辑以按任意顺序处理日期。

    【讨论】:

      【解决方案2】:

      sdt = 间隔开始日期,edt = 间隔结束日期。更改“2”以反映您想要计算的星期几。

      CREATE FUNCTION NMONDAYS( sdt DATETIME,  edt DATETIME ) 
      RETURNS INT DETERMINISTIC RETURN TIMESTAMPDIFF( WEEK, sdt, edt ) 
      + IF( DAYOFWEEK( edt ) >= 2 AND DAYOFWEEK( edt ) < DAYOFWEEK( sdt ),1,0)
      

      【讨论】:

      • 将尝试...并让您知道
      • 哎呀问题...客气了。如果日期输入错误并且日期完全相同,则必须小心,例如 2009 Oct 05 有 1 个星期一,但返回值为 0
      • 没人会这样做吗?他们会吗?我想你可以添加另一个 IF 来处理这个问题,比如 'IF ( DATEDIFF( edt, sdt ) = 0 AND DAYOFWEEK( edt ) = 2,1,0)'。
      【解决方案3】:

      在sql中:

      SELECT DATEDIFF(
              ADDDATE('20091001', 9 - CASE WHEN DAYOFWEEK('20091001') = 1 THEN 8
                                           WHEN DAYOFWEEK('20091001') = 2 THEN 9
                                           ELSE DAYOFWEEK('20091001') 
                                      END), -- first monday after date1
              ADDDATE('20091020', 2 - CASE WHEN DAYOFWEEK('20091020') = 1 THEN 8
                                           ELSE DAYOFWEEK('20091020') 
                                      END)  -- first monday before date2
                     )/7 + 1 -- divide the difference by 7 gives number of weeks
                             -- add 1 (nb points = nb intervals + 1)
                    ) NbMonday
      

      【讨论】:

        【解决方案4】:

        您可以从以下内容开始:

        select datecol1, TIMESTAMPDIFF(DAY,datecol1,datecol2) as numDays from table;
        

        然后在 PHP 中,您可以非常直接地计算出 d1 之后有多少个星期一,具体取决于 d1 是星期几(您可以使用 date() 和 strtotime() 来计算),以及 numDays 的值在结果集中。

        编辑:未经测试的代码,但总体思路应该可行:

        function daysUntilMonday($date){
            $dayOfWeek = date('w',strtotime($date));  //a number from 0-6, sunday is 0
            $daysTillMonday = (8 - $dayOfWeek) % 7; //modulus is your friend.
            return $daysTillMonday;    
        }
        
        function countMondays($start,$numDays){
            $numDays = $numDays - daysUntilMonday($start);
            return floor($numDays/7)+1;
        }
        

        可能会差一个,但通常应该是正确的方法。

        HTH

        【讨论】:

        • OO 这给了我之间发生的日子。现在我需要找出发生了多少个星期一:(
        【解决方案5】:

        不确定 MySQL 是否可行。 PHP是你的朋友..有几种方法可以解决它..可能使用strtotime获取开始时间戳和结束时间戳..然后通过添加86400运行for循环或从开始时间戳到结束时间戳的东西,并在每个增量上检查日期("D" , $mkt) == 'Mon' 看看它是否是星期一,然后增加你的计数器。给了你一个大概的想法。你可以从那里找出代码。

        【讨论】:

        • 我认为使用 timedev 解决方案和 cballou 解决方案的组合我可以在 MYSQL 函数中做到这一点。
        • 好吧,如果你想为此编写一个程序,那么我相信它非常有可能使用 MySQL .. 否则我想不出一个合理的方法来解决它,而不是创建一个临时表或其他东西.获得日子根本不是问题.. 但确保你有正确的星期一数是核心问题。如果您确实要使用 MySQL .. 请在这里与我们分享。
        • 在 mySQL 中看到一个函数确实很整洁。您可能可以使用我的(可能是 flakey)php 代码作为起点。这种日期计数的棘手部分总是边缘情况(当日期之间有零个星期一时会发生什么,等等)
        • @Sab: 会...但是需要时间@timedev: 零星期一应该返回 0
        【解决方案6】:
        function daysBetween($from, $to, $round = true) {
            // assume from and two can be valid date() values or strings
            $from = strtotime($from);
            $to = strtotime($to);
            $diff = $to - $from;
            $days = $diff / 86400;
            return ($round) ? floor($days) : round($days, 2);
        }
        

        【讨论】:

        • 那只会给出两个日期之间的天数..不会吗?
        • O wait NVM... 以上只会返回两个日期之间的天数
        猜你喜欢
        • 2020-01-18
        • 2019-03-25
        • 1970-01-01
        • 1970-01-01
        • 2013-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多