はじめに
コジマです。
datetime型はわかるけど、datetime2ってなんなの?
って人のための記事です。
私も最初見たときに「2」ってなんなの?ってなりました。
datetime2の説明
公式ドキュメントには以下のように定義されています。
24 時間形式の時刻と組み合わせた日付を定義します。 datetime2 は、既存の datetime 型を拡張して、日付範囲と既定の有効桁数を増やし、ユーザーが必要に応じて有効桁数を指定できるようにしたものと考えることができます。
datetimeを拡張して便利にしたよ。
というところですね。
datetimeと比較するとわかりそうです。
比較してみましょう。
datetimeとdatetime2の比較
以下に比較した表を記載します。
公式サイトからまとめました。
プロパティ | datetime | datetime2 |
---|---|---|
構文 | datetime | datetime2 [ (fractional seconds precision) ] |
使用法 | DECLARE @MyDatetime datetime
CREATE TABLE Table1 ( Column1 datetime ) |
DECLARE @MyDatetime2 datetime2(7)
CREATE TABLE Table1 ( Column1 datetime2(7) ) |
既定の文字列リテラル形式 | 適用なし | YYYY-MM-DD hh:mm:ss[.fractional seconds] |
期間 | 1753 年 1 月 1 日~ 9999 年 12 月 31 日 | 1年1月1日 ~ 9999年12月31日 |
時間の範囲 | 00:00:00 から 23:59:59.997 | 00:00:00 から 23:59:59.9999999 |
タイムゾーンのオフセット範囲 | なし | なし |
要素範囲 | YYYY は、年を表す 1753 から 9999 の 4 桁の数字です。
MM は、指定された年の 01 ~ 12 の月を表す 2 桁の数字です。 DD は、指定された月の (月に応じて) 01 ~ 31 の日を表す 2 桁の数字です。 hh は、00 ~ 23 の時を表す 2 桁の数字です。 mm は、分を表す 00 から 59 の 2 桁の数字です。 ss は、秒を表す 00 から 59 の 2 桁の数字です。 n* は、秒の有効桁数を表す 3 桁の数字です (0 から 999)。 |
YYYY は、年を表す 0001 から 9999 までの 4 桁の数字です。
MM は、指定された年の 01 ~ 12 の月を表す 2 桁の数字です。 DD は、指定された月の (月に応じて) 01 ~ 31 の日を表す 2 桁の数字です。 hh は、時を表す 00 から 23 までの 2 桁の数字です。 mm は、分を表す 00 から 59 までの 2 桁の数字です。 ss は、秒を表す 00 ~ 59 の 2 桁の数字です。 n* は、秒の小数部の有効桁数を表す 0 ~ 7 桁の数字です (0 ~ 9999999)。 Informatica では、秒の小数部が 3 桁より多いときは切り捨てられます。 |
文字長 | 19 文字以上、23 文字以下 | 19 文字 (YYYY-MM-DD hh:mm:ss ) 以上、27 文字 (YYYY-MM-DD hh:mm:ss.0000000) 以下 |
ストレージ サイズ | 8 バイト | 有効桁数が 3 より小さい場合は 6 バイトです。 有効桁数が 3 または 4 の場合は 7 バイトです。 その他のすべての有効桁数では 8 バイトが必要です。 |
精度 | 値は、.000、.003、または .007 秒単位に丸められます。 | 100 ナノ秒 |
既定値 | 1900-01-01 00:00:00 | 1900-01-01 00:00:00 |
Calendar | グレゴリオ暦 (完全な年の範囲は含まれません。) | グレゴリオ暦 |
ユーザー定義の 1 秒未満の秒の有効桁数 | いいえ | はい |
タイム ゾーン オフセットへの対応と保持 | いいえ | いいえ |
夏時間への対応 | いいえ | いいえ |
表からさらにまとめると、
- 1753年より古い日付が使える
- ミリ秒の制度が上がった
- ミリ秒以下の桁数の指定ができるようになった
ということが分かります。
さいごに
datetime2のことをちゃんと知りたかったので、まとめてみました。
業務でdatetime2型を使っていますが、正直datetimeでも十分ですねw
大は小を兼ねると言いますし、今は1バイト単位のメモリを気にすることもなく開発できる世の中ですので
SQL Serverで日付型を扱いたいときはdatetime2にしてあげるのがベターかもしれないですね。
datetimeのページ
https://docs.microsoft.com/ja-jp/sql/t-sql/data-types/datetime-transact-sql?view=sql-server-ver15
datetime2のページ
https://docs.microsoft.com/ja-jp/sql/t-sql/data-types/datetime2-transact-sql?view=sql-server-ver15
この記事を面白いまたは役に立ったと思ってくれた方は是非私のTwitter(@kojimanotech)を
フォローしてくれたらうれしいです!
もっと学びたい人はこちら
SQLをもっと学びたいエンジニアのためにおすすめのUdemy講座を紹介いたします!
SQLはじめましての人!まずあなたの3時間をください。
この講座でまずこれだけは覚えてくれ!という内容をしっかり押さえることができます。
SQLはプログラミング言語がなんであれ、システム開発に必要になります。
この講座を見て最低限必要な知識を身に着けて実践で貢献できるようになりましょう!
3時間で学ぶ SQL ・データベース 超入門【丁寧な解説+演習問題で SQL データ抽出の基本が身につく】標準 SQL
データベースの設計について学べる講座です。
設計について学べる教材は少ないので、実務でデータベースを触る人にはとてもうれしい講座です。
データベース講座1:データベース論理設計
ちょっとニッチに感じるかもしれませんが、SQLのインデックスを学ぶことができる講座です。
よい性能でSQLを運用するためにはインデックスの理解は必要不可欠です。
CRUD書いて満足するエンジニアを出し抜きましょう。
SQLServerのインデックスを理解して検索を速くする方法
気になった人はぜひ見てみてくださいね!
以上、コジマでした。