アプリ版:「スタンプのみでお礼する」機能のリリースについて

MYSQLとPHPを使っています。
MYSQLに作成日というDATA型のデータがあります。
そのデータから現在までの年数を表示したいのですがどのようにしたらできますか。

作成日:2010-8-09

現在:2012-10-26

年数:2年

A 回答 (5件)

俺だったら他の回答者と違ってMySQLを使っているならPHP側で処理させずにMySQL側の関数で処理するね。


単純に年だけで見て算数するなら
select (YEAR(NEW()) - YEAR(作成日)) as 年数 ~
しっかりと日付も考慮して計算するなら(ただし閏年の計算は省くので一年365日として計算する)
select TRUNCATE((TO_DAYS(NEWS() - TO_DAYS(作成日)) / 365,0) as 年数 ~

こんな感じかな。テストしてないので自分で確認してくれ。
    • good
    • 1

作成日が文字列なのかなと言うことで、こんな感じでどうでしょう。



---------------------------------------------------------------------

$date1 = '2010-8-09';//作成日:1
$date2 = '2012-10-26';//現在:2

list($Y1,$M1,$D1) = sscanf($date1,'%d-%d-%d');//作成日を年、月、日に分割:3
list($Y2,$M2,$D2) = sscanf($date2,'%d-%d-%d');//現在を年、月、日に分割:4

$a = JDToUnix(gregorianToJD($M1,$D1,$Y1));//作成日のUNIXタイムを求める:5
$b = JDToUnix(gregorianToJD($M2,$D2,$Y2));//現在のUNIXタイムを求める:6

$c = $b-$a;//現在と作成日の差を求める:7

$y = floor($c/(60*60*24*365));//1年間の秒数で割り小数点以下切捨て:8

---------------------------------------------------------------------
2の現在の日付は文字列としてますが、date関数とかで年月日をとりだして4に当てはめてください。
8で1年間を365日にしてますが、うるう年が含まれていても特に問題ないと思います。
    • good
    • 0

MySQLから取り出すときにdate_formatを通して、yyyymmddの形式で取り出すと楽です。

現在日付もdate('Ymd')で取得しておけば、各々のintvalの差を10000で割る(端数切り捨て)で求められます。

#元日付が2/29だと、2/28では1年に満たないのは上手く工夫するしかないです(汗


(例)
date型のカラム xxxdate を、$row['date_xxx'] に date_format('%Y%m%d', xxxdate) として取得したとして、

$now = date('Ymd');
$ydiff = floor((intval($now) - intval($row['date_xxx'])) / 10000);
    • good
    • 0

経過年というのは意外にめんどう



(1)作成日の月が現在の月より大きければ年の差-1
(2)同、小さければ年の差
(3)作成日の月と現在の月が同じの場合、日付が大きければ年の差-1
(4)同、日付が小さければ年の差
(5)同、日付が同じ場合はどうするかきめる

くらいの場合分けが必要です
例外的なうるう年の2/29から翌年の3/1はどうするのかとか仕様がむずかしい
    • good
    • 0

DATE型……ですかね?


とりあえずさっくり作ってみました(未検証)

/************************************
@param baseDate : 基準の日付
@param baseDate : 比較対象の日付
return 差分の年数を返却
************************************/
function calcDate($baseDate, $futureDate){
//区切り文字を指定し配列と化す
$arrDate1 = explode("-", $baseDate);//ベースの日付
$arrDate2 = explode("-", $futureDate);//比較対象

//指定した日時のUNIXタイムスタンプを取得する
$cd = mktime(0, 0, 0, $arrDate1[1], $arrDate1[2], $arrDate1[0]);//正規化
$fd = mktime(0, 0, 0, $arrDate2[1], $arrDate2[2], $arrDate2[0]);//正規化

if($cd > $fd){
$diff = $cd - $fd;
}else{
$diff = $fd - $cd;
}

return date("Y年", $dt);
}

ただし注意としては
explodeはあくまで区切り文字を指定して配列化するだけなので
タイムスタンプを対象にすると日付が狂います
例:yyyy-mm-dd hh:mm:ss
arr[0]:yyyy
arr[1]:mm
arr[2]:dd hh:mm:ss
この場合日付に日付以外の時間などが入ります
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!