Расчет количества дней между двумя датами

У меня есть база данных mySQL.

Мне нужно посчитать количество дней между двумя датами.

Мой клиент собирается заполнить ввод hm_date с 1 января 1979 года через форму php, чтобы создать новую запись.

Мне нужно поле total_days, чтобы вычислить общее количество дней с hm_date до настоящего времени. Мне нужно, чтобы это поле всегда обновлялось с каждым днем.

Как сделать так, чтобы hm_date отображался с общим количеством дней и всегда обновлялся?

Я полагаю, это может быть достигнуто на стороне сервера?

Следует использовать strototime()?


person Erik    schedule 11.05.2012    source источник


Ответы (3)


Вы захотите использовать MySQL DATEDIFF() < / а>

DATEDIFF () возвращает expr1 - expr2, выраженное как значение в днях от одной даты до другой. expr1 и expr2 - это выражения даты или даты и времени. При вычислении используются только части значений даты.

mysql> SELECT DATEDIFF('2007-12-31 23:59:59','2007-12-30');
        -> 1
mysql> SELECT DATEDIFF('2010-11-30 23:59:59','2010-12-31');
        -> -31

Основываясь на вашем вопросе, я думаю, вы хотели бы DATE_DIFF(hm_date, CURRENT_DATE). Просто убедитесь, что hm_date находится в формате YYYY-MM-DD.

person John Conde    schedule 11.05.2012
comment
Есть ли где-нибудь пример синтаксиса и как его написать? - person Erik; 11.05.2012
comment
это правильно? mysql ›SELECT DATEDIFF ('hm_date'); - ›1 MySQL› SELECT DATEDIFF ('total_days'); - ›-31 - person Erik; 11.05.2012
comment
Вам нужно передать DATE_DIFF() две даты в качестве параметров. Основываясь на вашем вопросе, я думаю, что вам нужно DATE_DIFF(hm_date, CURRENT_DATE). Просто убедитесь, что hm_date находится в формате ГГГГ-ММ-ДД. - person John Conde; 11.05.2012
comment
И это может быть на стороне сервера, поэтому мне не нужно создавать php на стороне клиента? - person Erik; 11.05.2012
comment
Большое спасибо за доведение до конца. Спасибо. :-) - person Erik; 11.05.2012
comment
Это правильный способ? ВЫБРАТЬ * ИЗ reg_add ГДЕ DATE_DIFF (hm_date, total_days) - person Erik; 11.05.2012
comment
Попробуйте SELECT DATE_DIFF(hm_date, total_days) AS days_diff FROM reg_add - person John Conde; 11.05.2012
comment
Я получаю эту ошибку: # 1305 - FUNCTION naturan8_41q.DATE_DIFF не существует - person Erik; 11.05.2012

С PHP:

$daydiff = floor( ( strtotime( $endDate ) - strtotime( $startDate ) ) / 86400 );

$ startDate и $ endDate могут быть любым допустимым форматом даты, описанным здесь: http://www.php.net/manual/en/datetime.formats.date.php

person Conrad Warhol    schedule 11.05.2012
comment
В сутках не всегда 24 часа. Во время перехода на летнее время это может быть 23 или 25. Поэтому иногда это может не сработать. - person Corbin; 11.05.2012
comment
Концепция дневной разницы не может быть вычислена программно, не предполагая, что день равен 24 часам. Правительство может установить дату перехода на летнее время. И снова это не может быть на 100% точным, если указаны только даты без ввода фактического времени. - person Conrad Warhol; 11.05.2012
comment
Ошибка в том, что день четко определен. Это просто не удобно определено. DST - сука, но сука, которую вы должны терпеть. Обнаружение ошибки в день летнего времени никогда не бывает приятным занятием, особенно когда вы смотрите на код и понимаете: «Уууу…» Полагаю, это было 24 часа. - person Corbin; 11.05.2012

Это довольно просто, но долго .. Пожалуйста, следуйте приведенным ниже кодам.

<?php

  // Set timezone
  date_default_timezone_set("UTC");

  // Time format is UNIX timestamp or
  // PHP strtotime compatible strings
  function dateDiff($time1, $time2, $precision = 6) {
    // If not numeric then convert texts to unix timestamps
    if (!is_int($time1)) {
      $time1 = strtotime($time1);
    }
    if (!is_int($time2)) {
      $time2 = strtotime($time2);
    }

    // If time1 is bigger than time2
    // Then swap time1 and time2
    if ($time1 > $time2) {
      $ttime = $time1;
      $time1 = $time2;
      $time2 = $ttime;
    }

    // Set up intervals and diffs arrays
    $intervals = array('year','month','day','hour','minute','second');
    $diffs = array();

    // Loop thru all intervals
    foreach ($intervals as $interval) {
      // Set default diff to 0
      $diffs[$interval] = 0;
      // Create temp time from time1 and interval
      $ttime = strtotime("+1 " . $interval, $time1);
      // Loop until temp time is smaller than time2
      while ($time2 >= $ttime) {
    $time1 = $ttime;
    $diffs[$interval]++;
    // Create new temp time from time1 and interval
    $ttime = strtotime("+1 " . $interval, $time1);
      }
    }

    $count = 0;
    $times = array();
    // Loop thru all diffs
    foreach ($diffs as $interval => $value) {
      // Break if we have needed precission
      if ($count >= $precision) {
    break;
      }
      // Add value and interval 
      // if value is bigger than 0
      if ($value > 0) {
    // Add s if value is not 1
    if ($value != 1) {
      $interval .= "s";
    }
    // Add value and interval to times array
    $times[] = $value . " " . $interval;
    $count++;
      }
    }

    // Return string with times
    return implode(", ", $times);
  }

?>

Теперь попробуйте это и посмотрите, как это показывает разницу ...

echo dateDiff("2010-01-26", "2004-01-26") . "\n";
echo dateDiff("2006-04-12 12:30:00", "1987-04-12 12:30:01") . "\n";
echo dateDiff("now", "now +2 months") . "\n";
echo dateDiff("now", "now -6 year -2 months -10 days") . "\n";
echo dateDiff("2009-01-26", "2004-01-26 15:38:11") . "\n";
person Anwar    schedule 11.05.2012