4

この形式で、日付がハードコードされたクエリがあります

startdate >= '2012-11-03' AND enddate <= '2012-11-30 23:59'

私のデータベースの日付形式は「mdy」ですが、yyyy-mm-dd を普遍的な日付構造として受け入れると確信しています。

特定のデータベース ユーザー (userX) に接続されているターゲット DB で SSMS でこのクエリを実行しようとすると、日付形式に関するエラーが発生します。

メッセージ 242、レベル 16、状態 3、行 1
varchar データ型から datetime データ型への変換により、範囲外の値が発生しました。

ただし、SA ユーザーとして接続されている正確なクエリを実行すると、クエリが実行されます..

どうしてこれなの?userX に完全な dbo パーミッション (sysadmin など) を与えましたが、それでもエラーが発生しますか?

4

2 に答える 2

4

文字列を使用して日時を指定する必要がある場合は、言語に依存しない安全な形式を使用する必要があります。

SQL Server では、これは ISO-8601 形式 (若干変更されています) でありDATETIME、言語、地域、および日付形式の設定に関係なく、常に機能する基本的に 2 つの安全な形式をサポートしています。

YYYYMMDD              (e.g. 20121231  for 31st of December 2012)  if you need date only

YYYY-MM-DDTHH:mm:ss   (e.g. 2012-12-31T21:05:00 for 31st of December 2012, 9:05pm)

ノート:

  • 最初の日付のみの形式には、ダッシュや区切り記号がありません!

  • 2 番目の形式には日付のダッシュがあり (省略可能)、文字列の日付部分と時刻部分の間に固定Tの区切り文字があります。

更新:最後のコメントに従って(2人のユーザーの異なるデフォルト言語について)-これを試してください:

-- this is how your `SA` interprets the string as datetime....
SET LANGUAGE english
SELECT CAST('2012-11-30 23:59' AS DATETIME)   

うまく動作します...

-- this is how your British user interprets teh string as datetime
SET LANGUAGE british
SELECT CAST('2012-11-30 23:59' AS DATETIME)

メッセージ 242、レベル 16、状態 3、行 7
varchar データ型から datetime データ型への変換により、範囲外の値が発生しました。

これは、文字列を 2012 年の 30 か月目の 11 日として解釈しようとしますが、明らかに失敗します....

于 2012-12-12T17:30:27.267 に答える
0

使用を検討する

開始日 >= '2012-11-03' AND 終了日 < '2012-12-01'

代わりは

于 2012-12-12T17:32:55.057 に答える