trapemiyaの日記

hatenablogが新しくなったんで新規一転また2019年1月からちょこちょこ書いてます。C#中心のプログラミングに関するお話です。

 日付をSQL serverへ保存する時は、DateTime型?

みなさんは日付をSQL serverへ保存する時に、どんな型で保存されてます?
日付だからDateTime型、もしくはSmallDateTime型だろう?っていう方が多いかもしれません。この二つの型が格納できる日付の範囲は、以下のようになります。

DateTime型 SmallDateTime型
日付範囲 1753年1月1日〜9999年12月31日 1900年1月1日〜2079年6月6日データ
バイト数 8バイト 4バイト

一般的なシステムの場合、2079年まで日付が持てれば十分ですので、バイト数節約のため、SmallDateTime型を選択する方も多いと思います。

しかし、ここで、無期限の日付を指定する必要がある場合はどうでしょうか?
9999/99/99のようにすればわかりやすいですよね。しかし、SmallDateTime型ですと、2079/06/06という変な日付になってしまいます。これが嫌ならDateTime型にして、9999/12/31なんて選択肢もできますが、やっぱり独断と偏見で9999/99/99の方が私は好きです。
そうなると、日付はString型で持たなきゃならなくなります。
西暦の頭2桁は20に決まっているんだから、99/99/99の方がすっきりします。2000年問題の次は2100年問題なので、正直知ったことじゃないですが、一応、内部的には99999999と西暦は4桁で持っておいてもいいかもしれません。ただし、当然ですが、表示する時に西暦2桁表示する場合は、select文でsubstringを使い、下6桁の切り出し等が必要になります。
やっぱり2100年問題は95年も先のことなんで、999999と6桁で持ってもいいかも。(^^;

日付をString型で持っても、日付計算したければDateTime型にプログラムでキャストすればいいので、全然問題ではありません。

というわけで何が言いたいかと言えば、日付だからと言って、DateTime型やSmallDateTime型を絶対使わなきゃいけない、ということはないということです。同じように、数字なら絶対にint型などの数値型を使わなきゃいけないということはありません。数字と空白なんかを同時に持ちたい場合は、もう数値型では無理です。ただし、数字をString型で持つ場合は並び順に注意が必要です。11 > 12111> 13 > 22 みたいな並び順になってしまいます。これを避けるには、
00011 > 00013 > 00022 > 12111 とみな同じ桁数で保存する必要があります。