LoginSignup
4
0

More than 5 years have passed since last update.

Fillしただけなのにハマったお話(.NETのDateとPostgreSQLのDateの範囲の違い)

Posted at

発端

あるシステムリプレースであったお話。
コードは大体こんな感じで、いたって普通なのにFill実行時に「指定されたキャストは有効ではありません。」とか言われる。

Public Function Fill(ByVal _sql As String, ByRef _cn As NpgsqlConnection) As System.Data.DataSet
  Dim da As New NpgsqlDataAdapter
  dim cmd As NpgsqlCommand
  Dim ds As New System.Data.DataSet
  cmd = New NpgsqlCommand(_sql, _cn)

  da.SelectCommand = Me.m_cmd
  da.Fill(ds)
  da = Nothing

  Return ds
End Function

解決

最初は「npgsqlのバグか?」とか思って最新版にしたりしたけど解決せず。
しかも検索結果を絞ると出たりでなかったり。
じゃやっぱりデータの方かと思ってよく見てみるとあるカラムに

10007-06-07

とかいう遠い未来がおった。
.NETのDate型はMAXで9999/12/31なのでこいつが原因でしたとさ。

経緯の方は

 ・前のシステム(COBOL)で日付型を使わず(っていうかない)に8ケタの数字を使ってた
 ・しかも未入力時に99999999を設定してた
 ・そんなデータがあるとは知らず旧システムからぶっこ抜いたデータを半自動で整形してポスグレに入れてた結果10007-06-07が誕生。

という感じ。

やっぱシステム移行には罠が多いねぇ。

あとあんま関係ないけどPostgreSQLって

select ('9999/99/99'::date)

はエラーになるける

select to_date('99999999','YYYYMMDD')

はエラーにならないんだね。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0