その理由は、dmyによって文字列リテラルが最初の日として解釈されるためです。つまり、8月10日ではなく10月8日になります。
解決策は、日付リテラルに常に明確な形式を使用することです(または、最初に文字列からの変換を処理する代わりに、適切に型指定されたパラメーターを使用することです)。
WHERE dtinsertdate = '20120810 22:48:41.047';
ご存知のように、日付のダッシュは、言語/日付形式の設定に応じて、実際の値の解釈が異なる場合があります。
別の方法は、ダッシュを保持するが、スペースの代わりにTを挿入することです。例:
WHERE dtinsertdate = '2012-08-10T22:48:41.047';
オリジナルの方が読みやすくなっていますが、言語と日付形式を固定した場合にのみ機能することが保証されています(たとえば、を試してみてくださいSET LANGUAGE FRENCH;
)。この実験を試してください:
SET DATEFORMAT DMY;
DECLARE @d DATETIME = '2012-08-10 22:48:41.047'
SELECT MONTH(@d);
GO
SET LANGUAGE FRENCH;
DECLARE @d DATETIME = '2012-08-10 22:48:41.047'
SELECT MONTH(@d);
GO
SET DATEFORMAT MDY;
DECLARE @d DATETIME = '2012-08-10 22:48:41.047'
SELECT MONTH(@d);
GO
SET DATEFORMAT MDY;
SET LANGUAGE ENGLISH;
DECLARE @d DATETIME = '2012-08-10 22:48:41.047'
SELECT MONTH(@d);
GO
結果が8になることもあれば、結果が10になることもあります。次に、上記で提案した2つの形式のいずれかを使用して再試行します。結果は常に8です。
私はここで読む価値のあるジューシーな詳細をたくさん持っています:
しかし、あなたが話している特定の問題については、常に、常に、常に次のいずれかの形式を日付/時刻リテラルに使用します。他の形式は安全だとは思いません。
日付と時刻の場合:
YYYY-MM-DDTHH:MM:SS...
YYYYMMDD HH:MM:SS...
日付のみ:
YYYYMMDD