Сколько дней произошло за определенный промежуток времени

Если у нас есть диапазон дат, такой как:

1 октября 2009 г. - 20 октября 2009 г.

Можем ли мы рассчитать, сколько понедельников произошло за

Ответ на это будет (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 или мне нужно создать функцию

12.10.2009 21:04:22
6 ОТВЕТОВ
РЕШЕНИЕ

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)
1
12.10.2009 22:11:02
martin clayton 12.10.2009 23:43:19
Ооооооооооо ... Вы должны быть осторожны, если даты введены неверно, и если даты точно совпадают, например, в 2009 году у 05 октября есть 1 понедельник, но возвращаемое значение равно 0
Angel.King.47 12.10.2009 23:45:29
Никто бы никогда не сделал это? Будут ли они? Я думаю, вы могли бы добавить еще один IF для этого, что-то вроде 'IF (DATEDIFF (edt, sdt) = 0 AND DAYOFWEEK (edt) = 2,1,0)'.
martin clayton 12.10.2009 23:52:48
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);
}
0
12.10.2009 21:10:25
это дало бы только количество дней между двумя датами .. не так ли?
Sabeen Malik 12.10.2009 21:15:45
О, подождите NVM ... выше будет только количество дней между двумя датами
Angel.King.47 12.10.2009 21:20:41

Вы можете начать с чего-то вроде:

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;
}

Может быть выключен одним, но в целом должен быть правильный подход.

НТН

1
12.10.2009 21:37:09
ОО, который дает мне дни, которые произошли между. Теперь мне нужно выяснить, как произошло много понедельников :(
Angel.King.47 12.10.2009 21:22:15

не уверен, если это возможно с MySQL. PHP ваш друг там ... есть несколько способов сделать это .. получить начальную и конечную временную метку, используя, вероятно, strtotime ... затем запустить цикл for или что-то от начальной временной метки до конечной временной метки, добавив 86400, и на каждом приращении проверять дату («D», $ mkt) == «Пн» и посмотреть, будет ли его понедельник, а затем увеличить счетчик ур. дал вам грубую идею .. вы можете выяснить код оттуда.

1
12.10.2009 21:15:04
Я думаю, используя решение timedev с комбинацией решения cballou, я могу сделать это в MYSQL Function.
Angel.King.47 12.10.2009 21:23:18
хорошо, если вы хотите написать процедуру для этого, то я уверен, что это очень возможно с MySQL .. в противном случае я не могу придумать разумный способ сделать это, кроме создания временной таблицы или чего-то еще. Получить дни совсем не проблема ... но главное - убедиться, что у вас правильное количество дней. Если вам удастся сделать это с MySQL .. пожалуйста, поделитесь с нами здесь.
Sabeen Malik 12.10.2009 21:28:44
Было бы здорово увидеть функцию в MySQL. Возможно, вы могли бы использовать мой (возможно, фальшивый) PHP-код в качестве отправной точки. Сложные части такого рода подсчета дат всегда являются крайними случаями (что происходит, когда между датами и т. Д.
timdev 12.10.2009 22:03:41
@Sab: будет ... но это займет время @timedev: ноль понедельников должно вернуть 0
Angel.King.47 12.10.2009 22:24:13

В 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
0
12.10.2009 22:07:33

Или это:

// 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;
}

Отредактировано для обработки дат в любом порядке.

0
12.10.2009 23:10:25