未分類

MS SQLServerの日付型キャストの仕様が面白い。

いや面白くないけど。

-- SQL Server 2000 SP4
-- Japanese_CI_AS

SELECT CAST('2010-04-01' AS DATETIME)
-- 構文エラー。文字列から日付/時刻に変換できませんでした。

SELECT CAST('2010-04-01' AS DATETIME)
-- 2010-04-01 00:00:00.000

SELECT CAST('2010-04-01' AS DATETIME)
-- 2010-04-01 00:00:00.000

-- SQL Server 2005 SP3
-- Japanese_CI_AS
SELECT CAST('2010-04-01' AS DATETIME)
-- 文字列から datetime 型に変換中、変換に失敗しました。

SELECT CAST('2010-04-01' AS DATETIME)
-- CHAR データ型から DATETIME データ型への変換の結果が日付/時刻の値の範囲外です。

SELECT CAST('2010-04-01' AS DATETIME)
-- 2010-04-01 00:00:00.000

-- SQL Server 2008 SP1
-- Japanese_CI_AS
SELECT CAST('2010-04-01' AS DATETIME)
-- 文字列から日付と時刻、またはそのいずれかへの変換中に、変換が失敗しました。

SELECT CAST('2010-04-01' AS DATETIME)
-- varchar データ型から datetime データ型への変換の結果、範囲外の値になりました。

SELECT CAST('2010-04-01' AS DATETIME)
-- 2010-04-01 00:00:00.000

JAPANESE_CI_ASなんだからそこらへんもうちょっと適当でいいじゃん、とか思うんだけど、それはともかく2000から2005のタイミングで全角数字が拒否されるよう仕様変更されている件。

もちろんWhere句などで利用しても同様のキャストは行われるので、日付っぽい全角文字列で比較などするとエラーになります。

設定とかで旧仕様に戻せるのかなこれ。