SQLite って何ってのは、とりあえずググって下さい。 本家はコチラ www.sqlite.org 。
どうやって落とすか、インストールするか、使うかってのも、色々リソースがあるので省略。
で、本題。SQLite での日付型は、UTCで管理されるというオハナシ。
たとえば
CREATE TABLE test2(id int, name text, UpdateDate datetime);
なんてのがあって、
insert into test2 values(1,’Tokyo’,datetime(‘now’));
なんてカマして安心していると、中に入っているのはUTCというコトです。
安心しきってると、日付データがもれなく9時間ずれます。プログラム内で現在時刻と比較したり、SQL Server とかと比較したりすると、軽めに死ねそうです。
で、どうするか。
1) SQLを工夫する
select datetime(UpdateDate,’localtime’) from test2;
とすると、ローカルタイムに変換してくれます。
データセットデザイナでやると、型推論がうまくいかないのか、Object型になっちゃうのが難点。
2) DataSet でなんとかする
DataSet – DataTable の当該行を選択してプロパティ→DateTimeMode を”Utc”に変更。
そうすると、DateTime の Kind プロパティが “Utc”になるので、ToLocalTime してOK。
3) コード内でアレコレ
DBから取ってきてそのまま突っ込んでも、”Kind”プロパティが”Unspecified”のママです。ようするに、「時刻がUTCか地方時なのか知らないけど、とにかく入ってるよ。」状態ってことです。
まぁ、確かに日本は夏時間もないのでそのまま9時間加算してあげれば良いような気もします。ただ何となく個人的にどうにも居心地が悪いのです。
やるとすれば、こんな感じかなと…
‘—-まずはDBから取ってきた生の状態が DateTime の中身。
Dim dteResult As DateTime = CDate(objCommand.ExecuteScalar())
‘—-これをUTC時刻として(つまりオフセット0で) DateTimeOffset に入れる。
Dim dtoLocal As New DateTimeOffset(dteResult, New TimeSpan(0))
‘—-ここで、地方時を呼び出す
Console.WriteLine(dtoLocal.LocalDateTime)
‘—-これできちんと地方時に変換されました。
ま、どの方法がどうこうもあるけど、知っとかないと痛手くらいそうな場所なのでメモ。