「users」という名前の MYSQL テーブルがあります。このテーブルには、各ユーザーの行があります。各行には、アカウントが作成されたときのタイムスタンプを含む「作成済み」という列があり、これはテンプレート「0000-00-00 00:00:00」です。「年齢」というコラムもあります。ユーザーがログインしたときに年齢を表示できるようにしたいです。ユーザーの年齢 (日数) を列に配置して表示できるように、この状況にアプローチする最善の方法は何でしょうか?
4 に答える
「年齢」を日単位で取得するには (つまり、現在の日時の真夜中と日時 (またはタイムスタンプ) 値の真夜中の整数日数の差) を取得するには、created
列に格納します。
SELECT DATEDIFF(NOW(),u.created) AS age_in_days
, ...
FROM users u
WHERE ...
age
同じ計算で列を移入するには:
UPDATE users u
SET u.age = DATEDIFF(NOW(),u.created)
WHERE ...
時間要素を含めることで、「年齢」を少し違った方法で計算したい場合は、
SELECT TIMESTAMPDIFF(DAY,u.created,NOW()) AS age_in_days
その結果は少し異なり、日数を計算するときに時間要素が考慮されていることに注意してください。検討:
SELECT TIMESTAMPDIFF(DAY,'2013-02-02 18:59','2013-02-03 14:00') AS age0
, DATEDIFF('2013-02-03 14:00','2013-02-02 18:59') AS age1
この値を保持したい場合、列に「年齢」の値を格納するのは少し冗長に思えます。述語を持つ任意のクエリage
、たとえば
WHERE u.age > 100
created
列に対して、同じように効率的に書くことができます。
WHERE u.created > NOW() + INTERVAL -100 DAY
ただし、時間コンポーネントが考慮されるため、わずかに異なる結果が返されます。日付部分のみで比較を行うと、効率が低下します。
WHERE DATE(u.created) > CURDATE() + INTERVAL -100 DAY
strtotime() 関数を使用して TIMESTAMP を unix 時間に変換し、time() で現在の unix 時間を取得し、現在の時間から誕生日時間を差し引いて年に変換することができます。
あなたの作成日が本当にタイムスタンプであり、それが呼ばれていると仮定するとcreationdate
:
SELECT YEAR(NOW()) - YEAR(creationdate) - (DATE_FORMAT(NOW(), '%m%d') < DATE_FORMAT(creationdate, '%m%d')) AS age FROM whatever
これは MySQL 内で実行されるため、ユーザーの情報を取得する SELECT の一部として返すことができます。
これにはDateTimeを使用してみてください:
$now = new DateTime();
$birthday = new DateTime('1973-04-18 09:48:00');
$interval = $now->diff($birthday);
echo $interval->format('%a days');