未分類
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
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句などで利用しても同様のキャストは行われるので、日付っぽい全角文字列で比較などするとエラーになります。
設定とかで旧仕様に戻せるのかなこれ。