5

そこで、SQL Server の ISDATE() 関数のドキュメントを見ていて、例でこれを見ました。

SET DATEFORMAT mdy;
SELECT ISDATE('15/04/2008'); --Returns 0.
SET DATEFORMAT mdy;
SELECT ISDATE('15/2008/04'); --Returns 0.
SET DATEFORMAT mdy;
SELECT ISDATE('2008/15/04'); --Returns 0.
SET DATEFORMAT mdy;
SELECT ISDATE('2008/04/15'); --Returns 1.

最後の例は 1 (有効な日付) を返しますが、上記の日付形式は関数の式の形式と一致しません。ドキュメントの間違いだと思ったのですが、不思議なことに自分で試してみると、実際には1が返されます。

では、日付形式が mdy の場合、なぜ「2008/04/15」が有効な日付なのですか?

ドキュメントはこちら: http://msdn.microsoft.com/en-us/library/ms187347(SQL.105).aspx

4

2 に答える 2

7

http://msdn.microsoft.com/en-us/library/ms187347%28SQL.105%29.aspx#SessionSettingDependenciesから

ISDATE の戻り値は、SET DATEFORMAT、SET LANGUAGE、およびデフォルトの言語オプションによって設定された設定によって異なります。

したがって、指定された文字列が設定された日付形式に適用されない場合、y/m/d のような形式の日付を許可するデフォルトの言語オプションも無効になります

于 2012-04-26T10:50:16.950 に答える
5

DateFormatをmdyに設定すると、この形式のすべての日付に対してtrueが検証されます。

mdyに従って無効な日付形式が見つかった場合は、言語に従って設定を確認します。言語でサポートされている有効な日付が見つかった場合はtrueを返し、そうでない場合はfalseを返します。

ユーザーAのデフォルト言語がus_englishの場合、2006年4月6日の日付は2006年4月6日と解釈されます。ユーザーBのデフォルト言語が「British」の場合、日付は6月4日と解釈されます。 2006年。

/* Use these sessions settings. */
SET LANGUAGE us_english;
SET DATEFORMAT mdy;
/* Expression in mdy dateformat */
SELECT ISDATE('04/15/2008'); --Returns 1.
/* Expression in mdy dateformat */
SELECT ISDATE('04-15-2008'); --Returns 1. 
/* Expression in mdy dateformat */
SELECT ISDATE('04.15.2008'); --Returns 1. 
/* Expression in myd  dateformat */
SELECT ISDATE('04/2008/15'); --Returns 1.

SET DATEFORMAT mdy;
SELECT ISDATE('15/04/2008'); --Returns 0.
SET DATEFORMAT mdy;
SELECT ISDATE('15/2008/04'); --Returns 0.
SET DATEFORMAT mdy;
SELECT ISDATE('2008/15/04'); --Returns 0.
SET DATEFORMAT mdy;
SELECT ISDATE('2008/04/15'); --Returns 1.

SET DATEFORMAT dmy;
SELECT ISDATE('15/04/2008'); --Returns 1.
SET DATEFORMAT dym;
SELECT ISDATE('15/2008/04'); --Returns 1.
SET DATEFORMAT ydm;
SELECT ISDATE('2008/15/04'); --Returns 1.
SET DATEFORMAT ymd;
SELECT ISDATE('2008/04/15'); --Returns 1.

SET LANGUAGE English;
SELECT ISDATE('15/04/2008'); --Returns 0.
SET LANGUAGE Hungarian;
SELECT ISDATE('15/2008/04'); --Returns 0.
SET LANGUAGE Swedish;
SELECT ISDATE('2008/15/04'); --Returns 0.
SET LANGUAGE Italian;
SELECT ISDATE('2008/04/15'); --Returns 1.

/* Return to these sessions settings. */
SET LANGUAGE us_english;
SET DATEFORMAT mdy;

数値形式では、区切り文字としてダッシュ(-)、ドット(。)、またはスラッシュ(/)を使用できます。SQL Serverが文字列を解析する方法の規則は、区切り文字によって変わりません。よくある誤解は、ANSI SQL形式(「ISO形式」と少し誤って呼ばれることもあります)、1998-02-23は、smalldatetimeおよびdatetimeに対して言語に依存しないというものです。そうではありません。これは数値形式であるため、SETDATEFORMATおよびSETLANGUAGE設定に依存します。

SET LANGUAGE us_english 
SELECT CAST('2003-02-28' AS datetime) 
-----------------------
2003-02-28 00:00:00.000

SET LANGUAGE british 
SELECT CAST('2003-02-28' AS datetime) 
Server: Msg 242, Level 16, State 3, Line 4
The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.

エラーメッセージをよくお読みください。それは問題が何であるかを正確に言います。日時の値を文字列として指定しますが、使用している形式とDATEFORMAT設定に従って文字列が形成されていないため、SQLServerは文字列を日時の値に変換できません。

于 2012-04-26T11:16:22.690 に答える