SQL Server 2008よりDate型、Time型という日付と時刻を扱うデータ型が追加されました。
今まではDateTime型を使って便宜的にこれらの代用をしてきたのですが、日付だけを表すためにDBとの入出力で余計なコードを記述する必要があったりして、面倒でした。
私事ですが、日頃日単位でのデータを扱うアプリケーションの作成が多くDate型は大きな福音です。
さて、そんな便利なDate型・Time型ですが、残念ながら.NET Frameworkにはぴったり一致する型が無く、日時が混合するDateTime型しかありません。コード上でそれぞれに時刻や日付が入らないように加工するとは思うのですが、安易にコードを書いてしまうと、それらの変化をとばして、データの追加や更新をしてしまうかもしれず、ちょっと心配になったので、Date型、Time型それぞれの列に’2007/8/11 12:33’のような日時混合データをINSERTしたときの挙動を確認してみました。
次のようなテーブルを作ります。
1: CREATE TABLE [dbo].[Log1](
2: [id] [bigint] NOT NULL,
3: [logDate] [date] NOT NULL,
4: [logTime] [time](7) NOT NULL,
5: [message] [nvarchar](max) NULL
6: ) ON [PRIMARY]
次のクエリーでデータを追加します。
1: INSERT INTO dbo.Log1 (
2: id,
3: logDate,
4: logTime,
5: message
6: )
7: VALUES(
8: 2,
9: '2007/8/11 12:34',
10: '2007/8/12 12:38:30.499',
11: 'TestMessage'
12: );
その結果です。
id logDate logTime message
——————– ———- —————- —————-
1 2007-08-11 12:33:00.0000000 TestMessage
2 2007-08-11 12:38:30.4990000 TestMessage
(2 row(s) affected)
Date型の列では時分が切り捨てられ、Time型の列では日付が切り捨てられて格納されていることを確認できると思います。
コメント