2012-05-11 24 views
1

私はmySQLデータベースを持っています。2日間の日数の計算

2つの日付の間の日数をカウントする必要があります。

私のクライアントは、新しいレコードを作成するために、の入力をPHPフォーム経由で1979年1月1日に入力します。

hm_dateから現在までの合計日数を計算するには、フィールドtotal_daysが必要です。私は毎日毎回それを更新するためにこのフィールドが必要です。

hm_dateは合計日数で表示され、常に更新されますか?

私はこれをサーバー側で達成できますか?

strototime()を使用しますか?

答えて

8

あなたは私はあなたがDATE_DIFF(hm_date, CURRENT_DATE)をしたいと思うあなたの質問に基づいて、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 

を使用したいと思います。 hm_dateYYYY-MM-DD形式であることを確認してください。 PHPで

+0

構文のどこかに例があり、それを書く方法はありますか? – Erik

+0

私の更新された回答を確認してください –

+0

これは正しいですか? mysql> SELECT DATEDIFF( 'hm_date'); - > 1 mysql> SELECT DATEDIFF( 'total_days'); - >-012 – Erik

1

$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

「日差」の概念は、1日を24時間と仮定せずにプログラムで計算することはできません。政府はdstの切り替えの日付を設定することができます。また、実際の時間を入力することなく、日付だけで100%正確にすることはできません。 –

+1

これは、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"; 
関連する問題