• 締切済み

日時を保存するカラムの型について

日時を保存する型としてベストな型はどれなのでしょうか? MySQL5.1にて日付を保存するカラムをdatetime型で設計をしていたのですがタイムゾーンを考慮したい場合にはどうするのがベストでしょうか? タイムゾーンを別カラムで持つ場合、単位を時間で持つと計算が手間のように感じ、それならunixtimeをint型で持って、時差情報も秒で持てば計算がらく、と思ったのですが、、、 こうやってますよ、という事例などありましたら教えてください

  • MySQL
  • 回答数1
  • ありがとう数1

みんなの回答

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.1

MySQLにも、time zone を変換する関数がありますので、datetime型と、time型またはvarchar型でtime zone情報を持たせておけば、以下のように取り出せるようですよ 関数 CONVERT_TZ(dt,from_tz,to_tz) 例 select CONVERT_TZ(`datetime_column`,`tz_column`,'JST') as jp_time ,* from `time_table`; マニュアルには「名前付きの時間帯を使用するには、時間帯テーブルが正確に設定されている必要があります。」 と有るので、time zoneは、'+9:00' のように指定する方が、MySQLの状態を選ばないようです。 計算時間については、どういった状態で取り出すことが多いかとか、件数とかによるので、なんとも。

sonkm3
質問者

お礼

ありがとうございます。 文字列ベースでタイムゾーンの差分を計算できるのですね。 試してみます。

関連するQ&A

  • 日付や日時を格納する場合の型はどうしていますか?

    WEBアプリケーションで データベース(MySQL)を使うのですが、 日付や日時を格納する場合の型は varchar(10)、date、datetime のどれにしていますか? 文字型と日付型か迷っているので、 メリット、デメリットがあれば知りたいです。

    • ベストアンサー
    • MySQL
  • MySQLで日時データをdatetime型に変換

    現在、MySQLにて日時情報を文字列として格納しているのですが、 日時の計算を行うために、datetime型に変換した上で 格納しなおしたいと考えています。 どのようにすれば良いでしょうか? よろしくお願い致します。

  • datetime型、未入力時の日時表示について

    PHP&MySQL初心者です。 同窓会の申し込みフォーム作成していますが、日時表示について質問です。 参加希望日時をカレンダー入力させて、データベースに登録しています。 日時はカラムを分けずにまとめてdatetime型にしています。 ■第一希望 [カレンダー入力](年月日時分をまとめて) ■第二希望 [カレンダー入力](年月日時分をまとめて) →データベース(mySQL)には、 datetime型「2016-01-05 02:50:00」形式で登録。 カレンダー入力せずにINSERTされたとき、datetime型だと、 「0000-00-00 00:00:00」で登録されますが、 この値を、date('Y年n月j日 g時i分', strtotime(カラム値)); で読み出すと、「1970 年 1 月 1 日 00:00:00」と表示されます。 このままではまずいので、単純に空欄としたいのです。 カレンダー入力されなかったとき、つまり、「0000-00-00 00:00:00」で登録されているとき、 日時表示を空欄にするスマートな方法はありますか?

    • ベストアンサー
    • PHP
  • MySQLのDatetime型の引き算

    ある機械の1日当たりの処理数を計算したいと思います。 Datetimeの引き算がうまくいかないので、解決方法を教えてください。 1日当たりの処理数は下記の式で計算できます。 1日当たりの処理数=期間内処理数÷((現在日時-作業開始日時)÷(60×60×24)) ※現在日時-作業開始日時で期間の秒数を計算 それを1日の秒数=86400秒(60秒×60分×24時間)で割る。 ------------------ 環境 MySQL:5.0.77 ------------------ テーブル: test カラム :num(INT型),start_date(DATETIME型) ※numは期間内の機械の処理数です。 まず、上記の1日当たりの処理数の数式をSQL文に反映させてみました。 SELECT num , num/((now()-start_date)/86400) as shorisu FROM test 結果は表示されるのですが、かなり大きな数値になって出てきてしまいます。 WEBで情報を検索したところ、DATETIME型を直接減算すると求める結果にならないことはわかりました。 MySQLのページ(11.5. 日付時刻関数) http://dev.mysql.com/doc/refman/5.1/ja/date-and-time-functions.html を見てみましたが、どの関数を使えばよいのかいまいちわかりません。 now()-start_dateの部分が正しい値を返すようになれば良いのですが、どのような式を書けばよいのでしょうか?

    • ベストアンサー
    • PHP
  • DATETIME型からUNIX時間を求める方法

    現在、MYSQL、DATETIME型 YYYY-MM-DD HH:MM:SS からUNIX時間を求める際に、気軽に質問出来る詳しい方が知り合いにおらずPHP学習中で知識が乏しいため、YYY-MM-DD HH:MM:SS をスペースで分割、をハイフンで分割、HH:MM:SSをコロンで分割、その後、mktimeに当てはめてUNIX時間を求めています。 他に簡単にDATETIME型からUNIXTIME求める関数などがありましたらご教示頂けましたら嬉しいです。 それとも、計算が必要な日時をMYSQLに格納する場合はINSERTする場合にUNIX時間でINSERTし、表示が必要な場合に、DATE関数等で日時として表示する方が良いのでしょうか?

    • ベストアンサー
    • PHP
  • MySQL「 INT」「 DATETIME」違い

    MySQLの「 INT」型と「 DATETIME」型の違いを教えてください。 ・「 DATETIME」型とは、単に日付形式を担保してくれる型に過ぎないのでしょうか? ・日付形式(フォーマット)以外を挿入すると、「0000」になってしまうということでしょうか? ■「 DATETIME」メリット ・データ内容が見た目で分かる以外、何があるのでしょうか? ■「 INT」メリット ・早い?

    • ベストアンサー
    • MySQL
  • Windows10での「メディアの作成日時」の表示

    Windows10のファイルのプロパティ画面に表示される「メディアの作成日時」についてですが、これは、時差(PCのタイムゾーン設定)を反映しますか? 日本で撮影したmp4ファイルの整理を海外で行っています。「メディアの作成日時」は、現在いる場所での日時(時差を反映)が表示されているのでしょうか?  更新時間や作成時間などの一般的なタイムスタンプなら、現地時間が反映されるのは分かるのですが、メタデータにまで反映されるという話は聞いたことがなかったので、戸惑っています。 例えば、現在扱っているファイルの「メディアの作成日時」は、「2018年10月17日午前11時40分」となっています。 しかし、たまたま当時このmp4を撮影したスマホは、ファイル名にタイムスタンプを記録する仕様だったようで、ファイル名が「VID_20181018_013936.mp4」となっており、「2018年10月18日午前1時39分36秒」と読めます。 現在いる国は、日本よりマイナス14時間の時差のある地域です。また、撮影した2018年当時は、私が使っていたパソコンはWindows7でした。スマホは何を使っていたか、借り物だったので覚えておりません。 「メディアの作成日時」といったメタデータにまで、現在いる地域のタイムゾーンが反映されて表示されるのでしょうか?

  • 適切なカラム型と長さを教えてください

    MySQL4.0.27です。 最近、MySQLの勉強を始めました。 PHPと合わせて、試行錯誤を繰り返していますが、どうしてもカラム型が理解できずにいます。 いろいろ調べましたがよくわかりませんでしたので、教えてください。 例えば、VARCHAR(100)というカラム型を設定すると、全角文字が33文字と半角文字が1文字入るようです。 次に、TINYTEXT(100)とすると、上記よりもっと長く格納できるようです。(文字数は未確認) 他にもBLOBやBINARYなどたくさんあり、どれを使うべきかわかりません。 以下のような場合、どの型をどれくらいの長さで設定するのが一般的なのでしょうか? ・住所などのように、比較的短いことが予想される文字列 ・メッセージなどのように、数十文字から数千文字までが予想される文字列 ・整数部3桁、小数部20桁程度の小数点数 上記3点について、一般的な型と長さを教えてください。

    • ベストアンサー
    • MySQL
  • 現在の日時より過去のデータを検索して更新

    お世話になります。 現在の日時を取得して、「 現在の日時より過去(以前)のデータが有る場合は、 該当のカラムデータを変更 」というスクリプトを実装しようと思っています。 例えば、「 現在の日時より過去(以前)のデータをSELECTする 」には、 --------------------------------------------------------------------- //現在の日時を取得 $time_now = date("Y/m/d H:i:s",strtotime("now")); // 「 $time_now 」より過去のデータを「 p_end_time 」カラムから取得 $sql = "SELECT id, user_id, p_end_time FROM テーブル名 WHERE p_end_time <= '$time_now'"; $stmt = $conn->prepare($sql); $stmt->execute(); foreach ($stmt as $row) { //取り出した「 user_id 」を「 $user_id 」に置き換える。 $user_id = $row["user_id"]; echo $user_id."<br>"; } --------------------------------------------------------------------- とすれば、該当のデータが出力されますが、同じ条件でUPDATEするには どの様な構文にすれば良いでしょうか? 「 user_id 」及び「 p_end_time 」の型は、何れもvarcharです。 「 p_end_time 」カラムをvarcharとした拘りは特にありません。 date等に変更することも可能です。 何卒、ご教示の程よろしくお願い申し上げます。 ---------------- ▼スペック PHP 5.3.3 MySQL 5.0.95 ----------------

    • ベストアンサー
    • PHP
  • MySQL TIMESTAMP型は、UTCですか?

    MySQL5で、 TIMESTAMP型のカラムに格納されるのは、UTCでしょうか。 それともローカルタイムゾーンなのでしょうか? あるいは、設定による、のでしょうか? >TIMESTAMP カラムの値は、ストレージでは現在のタイム ゾーンから UTC へ、読み出しでは UTC からカレントのタイム ゾーンに変換します。 http://dev.mysql.com/doc/refman/5.1/ja/time-zone-support.html と書いてあったのを見て、TIMESTAMP型のカラムに格納されるのは、UTC(日本時間-9)だ、と思ったのですが、 実際にカラムの中を確認してみると、その時点の日本時間が格納されています。 >TIMESTAMP 値は、現在のタイムゾーンから変換されて格納され、また検索された時に現在のタイムゾーンに再変換されながら、UTCに格納されます。 http://dev.mysql.com/doc/refman/5.1/ja/timestamp-4-1.html こちらでも、「UTCに格納されます」って書かれているのですが、 これは、「現在のタイムゾーンをそれぞれの接続ごとに設定した場合」に限っての話なのでしょうか? それとも、ストレージでは、って書かれているので、 ストレージのことが絡んでいるのでしょうか?(ストレージって何のことですか)

    • ベストアンサー
    • MySQL