-1

「users」という名前の MYSQL テーブルがあります。このテーブルには、各ユーザーの行があります。各行には、アカウントが作成されたときのタイムスタンプを含む「作成済み」という列があり、これはテンプレート「0000-00-00 00:00:00」です。「年齢」というコラムもあります。ユーザーがログインしたときに年齢を表示できるようにしたいです。ユーザーの年齢 (日数) を列に配置して表示できるように、この状況にアプローチする最善の方法は何でしょうか?

4

4 に答える 4

1

「年齢」を日単位で取得するには (つまり、現在の日時の真夜中と日時 (またはタイムスタンプ) 値の真夜中の整数日数の差) を取得するには、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

于 2013-02-03T00:29:41.150 に答える
0

strtotime() 関数を使用して TIMESTAMP を unix 時間に変換し、time() で現在の unix 時間を取得し、現在の時間から誕生日時間を差し引いて年に変換することができます。

于 2013-02-03T00:15:05.647 に答える
0

あなたの作成日が本当にタイムスタンプであり、それが呼ばれていると仮定するとcreationdate

SELECT YEAR(NOW()) - YEAR(creationdate) - (DATE_FORMAT(NOW(), '%m%d') < DATE_FORMAT(creationdate, '%m%d')) AS age FROM whatever

これは MySQL 内で実行されるため、ユーザーの情報を取得する SELECT の一部として返すことができます。

于 2013-02-03T00:09:52.707 に答える
0

これにはDateTimeを使用してみてください:

$now      = new DateTime();
$birthday = new DateTime('1973-04-18 09:48:00');
$interval = $now->diff($birthday);
echo $interval->format('%a days'); 

実際に見る

于 2013-02-03T00:10:24.540 に答える