- 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)」
|
|