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

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

新規登録して質問してみよう
ただいま回答率
85.37%
データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

5回答

4696閲覧

データベースの日付やタイムスタンプの型について

sprite

総合スコア63

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

1クリップ

投稿2015/12/25 04:44

いつもお世話になっています。

日付やタイムスタンプの型について、文字列と日付の型どちらを採用していますか?

僕はいつも日付と時間の項目を用意して、例えば20151225、1342という値を格納するようにしています。

そうすることで、その日付のデータや時間帯のデータを用意に取り出せるのです。

しかし、色々な記事でデータベースの日付の項目の型を見ると日付型が多いので気になりました。

日付型にすると、取り出してフォーマットを直すのに、手間が掛かりそうですが、主なやり方とそのやり方のメリットを教えてほしいです。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

日付型のメリット

  • 不当な日付(20150229など)が格納されることを未然に防げる
  • 日数計算が直接できる
  • タイムゾーン換算が直接できる
  • 表示の書式はクライアントアプリやユーザーの文化圏が決めることであるとすれば、データとしては純粋な日付時刻だけ持っているのが都合が良い

などといったところで、こうした必要性がないなら(将来的にも発生しないなら))独自形式で持つことに問題はないかと思います。

投稿2015/12/25 05:09

yuba

総合スコア5570

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

UPDATE文で年月を1ヶ月進めるリンク内容 が少し参考になるでしょう。
next_day, last_day などの日付型の関数もお使いのDBのマニュアルを確認してください。

投稿2015/12/25 05:06

編集2015/12/25 05:07
Orlofsky

総合スコア16417

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

手間は掛かりませんよ。例えばPHPであればdate関数があります。文字列でもっている方がフォーマットを直すのに手間が掛かると思います。
日付や時間の比較もできますし、日付の型でもった方が良いと思います。もちろん好みはありますが。

投稿2015/12/25 07:41

happyhappy

総合スコア346

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

私は用途次第で、日付型と文字列型での日付表現を併用する方が良いと考えています。ただ、時刻情報を文字列で持ったことは今の所ないですね。

データベース上に保持する内容は、表現対象を概念レベルで捉えた時の在り方など色々重視すべき点があるかと思いますが、日付項目に関して開発者が注意すべき点は、実装において日付項目を完全一致で比較することがあるかどうかが、一つ気をつけておくべきポイントになるのではないか?と思います。

例えば、レコード登録時点で常に値が入るべきログ的な登録日時や、更新された際の更新日時などは表示や参照値、範囲指定での検索対象項目として使うでしょうから、日付型で問題はないと思いますし、素直にクエリが書けると考えます。ただし、時刻を除いた日付部分の完全一致を判定する必要がある場合、日付型で保持していると、そのままではミリ秒など細かい部分まで完全一致していなければ成立しないことになります。DB によっては対処が簡単な場合もあるのかもしれませんが、一般的に時刻を考慮せず日付部分だけ一致しているかどうかを判定する場合、日付型の加工なり、範囲で一致させるような手間が発生してしまうでしょう。こういった状況では文字列で日付部分だけを持つ優位性が出てくると思います。(レコード総数が問題ない規模なら日付も文字列も両方持ってしまうのも手だと思います)

それ以外だと、発生日の保持が必要な場合に、null 許可の日付型で作るか、YYYYMMDD形式の項目に空文字で登録するか?という差が出るぐらいでしょうか?この状況についても別テーブルのレコードの有無で表現し、outer join を使って判定する方法もありますし、設計者の思想次第の所がありますね。

日付項目の書式化に関しては、DBレベルでもそうですが、実装に使う最近の開発言語や道具立てにおいては、日付型に対する標準ライブラリレベルでのサポートが豊富ですから、書式化に関しては日付型に優位性があるように感じます。

以上、ご参考になれば幸いです。

投稿2015/12/25 06:07

ps13zier

総合スコア433

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

日付型で持っておけば、日付の関数で日付と時間を簡単に分けられるので、
わざわざ日付と時間の項目を別項目で持つメリットはあまりないと思います。
日付関数で翌日や一か月後などの計算も簡単にできるので、日付項目は
日付型で定義したほうが何かと便利だと思います。

SQLで抽出する際に日付のみを抽出したいのか、時間も含めて抽出したいのか
気を付ける必要はあります。
SQLServerであれば、CONVERTやFORMAT関数を使用すれば、自分が欲しい
書式で抽出できます。

投稿2015/12/25 05:29

tomo.ina

総合スコア357

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問