2012-05-11 4 views
1

У меня есть база данных mySQL.Расчет количества дней между двумя датами

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

Мой клиент собирается заполнить ввод hm_date с 1 января 1979 г. по электронной почте для создания новой записи.

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

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

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

Должен ли я использовать strototime()?

ответ

8

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

DATEDIFF() returns expr1 – expr2 expressed as a value in days from one date to the other. expr1 and expr2 are date or date-and-time expressions. Only the date parts of the values are used in the calculation.

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.

+0

Есть ли пример для синтаксиса и как его написать? – Erik

+0

Проверьте мой обновленный ответ –

+0

это право? mysql> SELECT DATEDIFF ('hm_date'); -> 1 mysql> SELECT DATEDIFF ('total_days'); -> -31 – Erik

1

С PHP:

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

$ STARTDATE и $ ENDDATE может быть любой допустимый формат даты объясняется здесь: http://www.php.net/manual/en/datetime.formats.date.php

+3

День не всегда 24 часа. Во время DST это может быть 23 или 25. Как таковое, это может иногда терпеть неудачу. – Corbin

+0

Концепция «дневной разницы» не может быть запрограммирована автоматически, не предполагая, что день составляет 24 часа. Правительства могут установить дату переключения dst. И снова он не может быть на 100% точным только с датами, без ввода фактического времени. –

+1

Ошибка в том, что день * * четко определен. Это просто не * удобно * определено. DST - сука, но сука, которую вы должны терпеть.Наличие ошибки, появившейся в DST-день, никогда не бывает приятным, особенно когда вы смотрите на код и отправляетесь «Awww ... я предполагаю, что это было 24 часа». – Corbin

1

Его довольно легко, но долго .. Пожалуйста, следуйте следующим кодам

<?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"; 
Смежные вопросы