Подсчитайте количество недель на основе дат, используя PHP - PullRequest
1 голос
/ 09 декабря 2010

Я хотел бы иметь возможность выводить временную шкалу, содержащую количество недель из серии дат, содержащихся в таблице. Например, предположим, у меня есть даты 12/9/10 (четверг), 13.12.10 (понедельник), 15/12/10 (среда) и 21.12.10 (вторник), каждое в записи в таблице MySQL.

То, что я хотел бы вывести - это то, что рассчитывает количество недель на основе этих дат, например:

Неделя 1: 12.09.10 Неделя 2: 13.12.10, 15.12.10 Неделя 3: 12/21/10

Я знаю, как получить номер недели в данном году (как, например, сегодня мы на неделе 49), но, поскольку у меня может быть ЛЮБОЙ диапазон дат, я вычисляю недели, а не неделю года.

Я мог бы просто преобразовать недели года в счетчик и отобразить их последовательно (если даты начинаются на неделе 49 и продолжаются до недели 52, недели 49 = 1, недели 50 = 2 и т. Д.), Но если у меня есть даты, которые охватывают более 2 лет (например, с 12/25/10 по 1/2/11), это проблематично.

Любая помощь будет принята с благодарностью! Мне не нужен код MySQL - просто преобразование строки даты. Я крутил свои колеса на этом!

ОБНОВЛЕНИЕ: Просто подумал, что поделюсь кодом, который наконец решил эту проблему. Это не мое окончательное решение, так как данные все еще нужно обрабатывать, но я получил то, что хотел, и теперь я могу работать с этими данными. Спасибо всем, кто оставил ответ.

<?php 
header("Content-type: text/html; charset=utf-8");
require_once('includes/connections/know_db.php');
?>

<?php

//First let's get all the years any given project will span...
mysql_select_db($database_know_db, $know_db);
$query_GetYears = sprintf("SELECT DISTINCT(YEAR(target_date)) as project_years FROM project_items WHERE projects_id = 136 AND target_date IS NOT NULL ORDER BY project_years ASC");
$GetYears = mysql_query($query_GetYears, $know_db) or die(mysql_error());

//A function allowing us to extract the week of the year from the next query, and then convert its value into an integer.
function ConvertToWeek($target_date) {
    $week = date('W', strtotime($target_date));
    $week_int = intval($week);
    return $week_int;
}

//Now let's loop through our years, and get project item data (via MySQL) for each...
while ($row_GetYears = mysql_fetch_assoc($GetYears)) {
    echo $row_GetYears['project_years']."<br />";

    mysql_select_db($database_know_db, $know_db);
    $query_GetItems = sprintf("SELECT DISTINCT(target_date) FROM project_items WHERE projects_id = 136 AND target_date IS NOT NULL AND YEAR(target_date) = '".$row_GetYears['project_years']."' ORDER BY target_date ASC");
    $GetItems = mysql_query($query_GetItems, $know_db) or die(mysql_error());

    //Loop through the results of our project items, convert them to week numbers from our function, then toss them into an array.
    while ($row_GetItems = mysql_fetch_assoc($GetItems)) {
        $weeks[] = ConvertToWeek($row_GetItems['target_date']);
        //Array_unique essentially removes duplicate numbers...
        $result = array_unique($weeks); 
    }

    // get the first value in the $weeks array, then to be safe, convert its value to an integer.
    $start_week = array_shift(array_values($weeks));
    $start_week_no = intval($start_week);

    // get the last value in the $weeks array (will use this later to find differences in weeks between overlapping years).
    $end_week = array_pop(array_values($weeks));

        echo 'Start week: '.$start_week_no."<br />";
        echo 'End week: '.$end_week."<br />";

    //Output our weeks for the purposes of display.
    foreach ($result as $week_count) {
        echo ltrim($week_count, "0").'<br />';
    }

    /*Now let's find the weeks in the sequence where weeks are not represented (missing).
    By doing this, we can get a number of for each week we don't have where datasets will be empty.
    */

    // construct a new array:1,2....max(given array).
    $result2 = range($start_week_no,max($result));                                                    

    // use array_diff to get the missing weeks 
    $missing = array_diff($result2,$result);

    //Output our missing weeks for the purposes of display.
    foreach ($missing as $missing_weeks) {
            echo $missing_weeks.' (missing)<br />';
    }

    /*
    Before we close our original while loop--the one that loops through each year, we need to unset our arrays so they are empty upon 
    each new loop.
    */
    unset($weeks);
    unset($result);

//End our original while loop.
}
?>

Ответы [ 6 ]

2 голосов
/ 09 декабря 2010

Возьмите дату начала и получите из нее номер текущей недели (если хотите, базу).Я бы, вероятно, рекомендовал бы умножить его на год или что-то еще, чтобы вы знали, когда годы перекрываются.Затем возьмите всех преемников и сделайте то же самое (неделя * год) и вычтите из него базу.

1 голос
/ 19 декабря 2012

Это то, что я придумал как функцию, чтобы найти количество недель, прошедших между любыми двумя датами.

public function weeks_past(){
    $start_date = strtotime('01/07/2012');
    $end_date = strtotime('01/05/2013');

    $start_week = date('W', $start_date);
    $end_week = date('W', $end_date); 

    $start_year = date('Y', $start_date);
    $end_year = date('Y', $end_date);
    $years = $end_year-$start_year;

    if($years == 0){
        $weeks_past = $end_week-$start_week+1;
    }
    if($years == 1){
        $weeks_past = (52-$start_week+1)+$end_week;
    }
    if($years > 1){
        $weeks_past = (52-$start_week+1)+$end_week+($years*52);
    }

    return $weeks_past;
}

Это вывело бы 53 недели, прошедшие с 01.07.2012

1 голос
/ 10 декабря 2010

Поскольку запрос включает в себя сложные вещи, ответ будет таким же.

  • Сортировка дат ASC (очевидно)
  • Выполнение каждого цикла
    • Получениепеременный год для этой даты: $year = date('Y',strtotime($date);)
    • Получите переменную неделю для этой даты: $week = date('W',strtotime($date);)
    • Создайте значение $ yearWeek, используя эти значения: $yearWeek = $year.$week;
    • Вставить эту дату в массив array_push($weekArray,$yearWeek,$date);
  • Закончено с циклом, к этому моменту, я полагаю ...
  • Взять этот массиви сортируйте его sort($weekArray);
  • Запустите ваши результаты в новом цикле, вы знаете, как foreach
    • Для каждого уникального $ yearWeek, добавьте в свой $ weekCounter, например, $ weekCounter ++
    • Выведите ваш массив, используя переменную, которую вы посчитали в $ weekCounter

Не знаю, работает ли это, возможно, поэкспериментируйте с этим позже, но разместил это просто дляВы представляете, что вы можете сделать.Это не полное решение, но, возможно, стоит начать с него.

1 голос
/ 09 декабря 2010

Из приведенных вами примеров видно, что вы берете обычную календарную неделю, поэтому вы не подразумеваете, что неделя должна начинаться с вашего первого свидания.

Не эксперт по PHP, но вы можете сделать это:

  • Рассчитать день недели первого свидания (исходя из того, какое у вас начало недели - воскресенье, понедельник и т. Д.).
  • Рассчитайте разницу всех более поздних дат от первой даты в днях.
  • Добавьте смещение дня первой даты ко всем более поздним датам.
  • Разделите все это на 7, отбросьте остатки, и вот ваш ответ.
0 голосов
/ 09 декабря 2010

Вы можете попробовать что-то вроде этого:

SELECT (YEAR(date_field) * 100 + WEEK(date_field)) - (SELECT MIN(YEAR(date_field) * 100 + WEEK(date_field)) - 1 FROM table) AS week_number FROM table;

Этот запрос создает целое число из года и номера недели. Год умножается на 100, чтобы добавить место для номера недели. Таким образом, вы получите уникальные номера для каждой недели, независимо от года. Например. число на сегодня (неделя 49) будет равно 201049. Запрос вычитает минимальное число из этого числа, чтобы получить номер недели, начиная с 0. Обратите внимание на - 1 в конце подзапроса. Номер недели начинается с 1.

При такой структуре запросов вам не нужно предпринимать дополнительных действий для работы над проектами, начинающимися в конце года и заканчивающимися в начале.

0 голосов
/ 09 декабря 2010

Мне не нужен код MySQL - просто преобразование строки даты

date('W', strtotime('12/21/10'))

Это вернет неделю для этой даты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...