質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.23%

データベースに作成日時を記録する場合はPHP側、MYSQL側どちらで日付を取得するのか

解決済

回答 5

投稿

  • 評価
  • クリップ 4
  • VIEW 1,331

bws

score 51

データベースに作成日時を記録する場合、

1、PHP側でdate('Y-m-d h:i:s')のように取得したデータをmysqlのdatetime型に記録する
2、mysqlの型をtimestampにする

一般的にはどちらが正しいのでしょうか?
もしくはその時々で使い分けるのでしょうか?
その場合のメリットデメリットなどを教えていただけると大変ありがたいです。よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

+4

実際にINSERTが実行された時点の時間にしておきたいから TIMESTAMP型の列に CURRENT_TIMESTAMP を設定します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/26 18:08

    INSERTする時とあらかじめPHPで生成した時と時間が違うというのが頭にありませんでした。とても勉強になります、ありがとうございます。

    キャンセル

checkベストアンサー

+3

一般的にはどちらが正しいのでしょうか?
もしくはその時々で使い分けるのでしょうか?

どのようにしても実現可能な以上は「正しい」という唯一の答えというのは存在しません。
「作成日時」「更新日時」というのを両方持っておきたいのでしたら「作成日時」は初回作成の時以外は更新されてはいけないのでPHPのほうで取得した時間を入れるでしょうし、「更新日時は常に更新されるもの」であればDBをCURRENT_TIMESTAMPにすれば良いですが、
「更新するかどうかを制御したい」という場合はこちらもPHPのほうで取得した時間を入れることになります。
例:ユーザーテーブルにログイン日時を持っているが「これはシステム側で勝手に更新するものだしユーザー自身がユーザー情報を更新した日時じゃないから更新したくない」という”仕様”にした場合、など

つまり「ケースバイケース」です。
私の場合は基本的にプログラム側から制御したい方ですが、仕様や設計によりCURRENT_TIMESTAMPを選択することもあります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/26 18:21

    現時点ではDB側に統一できそうなのでそのように進めようと思えました。
    大変貴重なアドバイスありがとうございます。

    キャンセル

  • 2018/11/26 18:28

    ケースバーケースについてはmst10806さんが回答されている通りです。
    例えば、バッチ的に複数のデータを扱うようなケースで日を跨ぐような処理になった場合に、開始の日に揃えたいような場合は、current_date()は使用できません。

    キャンセル

  • 2018/11/26 18:30

    補足ありがとうございます。

    キャンセル

+2

一番楽なのは、作成日時のカラムのデフォルト値としてCURRENT_TIMESTAMPにしておけば、
データベース側で自動的に現在日時が設定されるし、
わざわざSQL文上に作成日時に係るカラムを与えなくても済むし。

次は、SQL文に必ず作成日時のカラムにCURRENT_TIMESTAMPを与えるようにすること。
データベース側で自動的に現在日時が設定される。

次は、PHP内でシステムの日時取得してSQL文に詰めること。

実行SQLをログ取得してデバッグに活かすなんてときは、
案外3番目の方法のほうが追いやすくなったりもするので、
「後悔のないように好きなのを選べ」です。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/26 18:19

    ありがとうございます。
    毎回SQL文でCURRENT_TIMESTAMPするというパターンをしりませんでした。
    後悔のない選択ができるように精進したいと思います。

    キャンセル

+2

PHP 側で取得した時刻を DB に渡す方が、時刻をモックできるようにできるので、テストは書きやすいですよ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/05 11:45

    どちらもメリット、デメリットがありますね。場合によって使い分けられるように意識したいと思います!

    キャンセル

+1

CURRENT_TIMESTAMPにすればいいという意見がありますが、そのサーバーのロケールはおそらくja-jpですよね?
そういう設計者の設計したシステムが、「サマータイム導入」などで、あたふたすることになるんだと思います。
私の設計したシステムでは、サマータイムが導入されても何も問題は起きません。(←外部サイトがサマータイムに対応していないのは別問題)
本筋とは関係のないポエム回答で申し訳ない!

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/05 11:41

    サーバー側の設定に左右されてしまうというのは結構なデメリットですね。貴重な回答ありがとうございます!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる