1

DATETIMEという列を持つテーブルがありますdtInsertDate

この列の値はです'2012-08-10 22:48:41.047'。この日付は2012年8月10日です。

次のSELECTステートメントを実行して、この行を取得します。

select *
from myTable
where dtinsertdate = '2012-08-10 22:48:41.047'

dateformat不可解なのは、オプションがのときにこのSELECTを実行するとmdy、その行が見つかることです。

dateformatオプションがのときにデータベースの別のコピーで実行するとdmySELECTは何も返しません。

どうしてこれなの ?

4

1 に答える 1

5

その理由は、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
于 2012-08-11T14:24:04.217 に答える