Oracle・SQL Server 日付型について


ITコーディネータのシュウです。

花_2

ソチオリンピック、パラリンピックが終わってしばらくたちましたが、まだ感動が残っていますね。

羽生選手のように、力を存分に発揮できた人もいれば、練習してきた成果を完全には発揮できなかった人もいましたが、浅田選手のように、前半の失敗で絶望のような状況になりながらも、気持ちを切り替えて後半は全てを出し切って表現し、皆に深い感動を与えてくれた選手もいました。最後笑顔で終えることができて、本当によかったと思います。日本中の人たちがそう思ったでしょう。ジャンプ団体も夜中ずっとテレビで応援してましたが、インタビューにも感動しました。

オリンピックに出ること自体がとても大変なことでしょうが、本番で自分の力を出し切ることはどれほど難しいことかと思います。しかし、それぞれに見るものに感動を与える力があり、やっぱりスポーツとはすばらしいですね。選手一人ひとりに拍手を送りたいです。

it-coordinator①-1

<本日の題材> 【日付型について】

日付・時刻に関する型は、

Oracle:
  date、timestamp、timestamp with time zone

SQL Server:
  datetime、smalldatetime
                                    -- SQL Server2005まで
  date、time、datetime2、datetimeoffset
                                    -- SQL Server2008から追加
などがあります。

私も過去、システム開発でよく使用していたのは、Oracleでは「date」型、SQL Serverでは「datetime」型(どちらも、日付と時刻の両方の値を保持)だったのですが、他にも上記のような型が存在しています。

SQL Serverで「datetime」型を使用していた時に、たまたま登録しようとしたデータに 1753/1/1 よりも古い値が存在していたときに、エラーになったことがあり、そんな制限があるんだとびっくりしたことがありました。

ちなみに、エラーメッセージはこんな感じ:

メッセージ 242、レベル 16、状態 3、行 3 varchar データ型から datetime データ型への変換の結果、範囲外の値になりました。

なぜ 1753 年から開始なのか? それは datetime 型が「グレゴリオ暦」であることに起因しているようで、当時のイギリス帝国 (とその植民地) でグレゴリオ暦を採用した年が1752 年であり、通年としてグレゴリオ暦が始まったのが 1753 年からだからとのこと。 (ちなみに Oracleの「date」型は -4712/01/01 ~ 9999/12/31 までの範囲)

SQL Server2008からは、新しく 「datetime2」型:西暦1/1/1以降のデータを扱えるもの、 「date」型: 時刻の部分はなく日付部分のみをデータとして持つもの、 「time」型: 時刻の部分のみ持ち、時間も100ナノ秒まで扱えるもの などが増えています。

これに対して、Oracleも「timestamp」型というもので、日付+時刻で最少ナノ秒単位まで扱える型があります。

また、タイムゾーン・オフセットを考慮した型もあり、下記のようなものがあります。

Oracle:timestamp with time zone、timestamp with local time zone SQL Server:datetimeoffset

タイムゾーン・オフセットとは、ローカル時間とUTC(協定世界時、以前のグリニッジ標準時)との時差(時間および分単位)になり、日本の標準時間はグリニッジ標準時に9時間プラスした時間となります。

どういうときにこの型を使うのか?というと、グローバルに展開する企業のシステムなどで、時差がある国や地域で作成した部品を組み立てて製品を完成しユーザに届けるような場合、各地の時刻で日付を登録するとわかりにくくなるところを、全てある地域の時刻に変換して表現することで、システムとしてわかりやすくするような場合など、この型が必要な場合があるようです。

日付関数などについて、続きは次回

 

にほんブログ村 IT技術ブログへ
にほんブログ村

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>