データベース - データ型 - DATETIME TIMESTAMP 日時


 クラウディア


1. 概要
2. PostgreSQL
3. MySQL
4. 参考サイト

1. 概要

 日時なんざ、データベースで一番使われるもののひとつですが、方言もやたら多い。  「DATE」「TIME」で分かれているものもあるし、「DATTIME」がないものもある、結構、扱いに注意が必要なのです。

2. PostgreSQL

 「PostgreSQL」には、「DATETIME」型がないのだ。  日時は、下記のデータ型で扱います。  細かくいうと 6 種類、おおまかには、4 種類といったところでしょうか。
バイト数 説明 制度 備考
timestamp [ (p) ] [ without time zone ] 8 日付と時刻両方(時間帯なし) 1マイクロ秒
timestamp [ (p) ] with time zone 8 日付と時刻両方、時間帯付き 1マイクロ秒
date 4 日付(時刻なし) 1日
time [ (p) ] [ without time zone ] 8 時刻(日付なし) 1マイクロ秒
time [ (p) ] with time zone 12 時刻(日付なし)、時間帯付き 1マイクロ秒
interval [ fields ] [ (p) ] 16 時間間隔 1マイクロ秒

 「with time zone」と「without time zone」で分かれるのが、特徴的ですな。

3. MySQL

 「MySQL」には、次の型が用意されています。
説明 フォーマット 範囲 ゼロ値 備考
DATE 日付 YYYY-MM-DD '1000-01-01' から '9999-12-31' '0000-00-00'
DATETIME[(fsp)] 日時 YYYY-MM-DD HH:MM:SS[.fraction] '1000-01-01 00:00:00.000000' から '9999-12-31 23:59:59.999999' '00:00:00'
TIMESTAMP[(fsp)] タイムスタンプ '1970-01-01 00:00:01.000000' UTC から '2038-01-19 03:14:07.999999' UTC '0000-00-00 00:00:00'
TIME[(fsp)] 時間 HH:MM:SS[.fraction] '-838:59:59.000000' から '838:59:59.000000' '0000-00-00 00:00:00'
YEAR[(4)] YYYY 1901 から 2155 0000

 ゼロ値という特別な値を持っているのが、特徴かな。
 あと、注意点として、「DATETIME」は、日付+時刻をそのまま保存するので、タイムゾーンの影響を受けないそうですが。
 「TIMESTAMP」は、「UNIX」時刻に変換して保存するので、タイムゾーンによって自動変換されるそうです。
 「API」などで「UTC」で送られてきたデータをそのまま「TIMESTAMP」に保存すると、自動でローカル時間に変換され、ずれが生じてしまうそうなのです。

 「DATETIME」型で、ミリ秒やマイクロ秒まて使いたい場合は、それぞれ下記のように宣言します。


DATETIME(3)
DATETIME(6)
 「PostgreSQL」の「interval」のような時間間隔を表すデータ型はないようです。  「INTERVAL」というキーワードで、時間の演算はできますが、これは型ではありません。  「TIME」型を使用して、「-838:59:59 ~ 838:59:59」の範囲を扱うか、「INT」なり「BIGINT」でミリ秒やマイクロ秒の数値を表現することになります。

4. 参考サイト

 本ページは、下記のサイトおよび「ChatGPT」軍曹を参考にさせていただきました。
8.5. 日付/時刻データ型」
「MySQL :: MySQL 8.0 リファレンスマニュアル :: 11.2 日時データ型」
「MySQL | 日付型と時刻型(DATE, TIME, DATETIME, TIMESTAMP, YEAR)

EaseUS
AbemaTV 無料体験