Database.Guide

おそらく、SQL Server を使用しているときに T-SQL の PARSE()CAST()、および CONVERT() 関数に出会い、その違いは何だろうと思ったことがあるのではないでしょうか。 この記事では、これらの関数の主な違いについて概説することを目的としています。

比較

SQL Server の CONVERT()CAST()PARSE() 関数の主な違いをまとめた表があります。

CONVERT() CAST() PARSE()
公式定義 あるデータ型の式を別のデータ型に変換する。 あるデータ型の式を別のデータ型に変換します。 SQL Server で要求されたデータ型に変換された式の結果を返します。
受け入れられた値 任意の有効な式。 Any valid expression. String.
Return Value 2nd argument, translated to the requested data type as provided by the 1st argument.
Return Value 2nd argument, translated to the requested data type in the 1st argument. 1st 引数、2nd 引数によって提供されるように要求されたデータ型に変換されます。
Supported Conversions Between any two data types. From string to date/time and number types only.
Accepts the style Argument? Yes.Yes. No. No.
カルチャー引数を受け入れるか? No. No. Yes.
Requires .NET Framework? No. No. Yes.Yes.

上の表に加えて、いくつかのポイントがあります:

  • Microsoft のドキュメントでは、PARSE() はリモートされないと指摘しています(CLR の存在に依存しているため)。 CLR を必要とする関数をリモートで実行すると、リモート サーバーでエラーが発生します。
  • PARSE() は処理できるが CAST()CONVERT() は処理できない値があります (たとえば、特定の日付形式を使用する文字列など)。
  • CAST() は ANSI SQL-92 標準に含まれています。
  • CAST() は他の 2 つよりもパフォーマンスが良いという意見もあります。
  • 文字列値をパースする際には一定のパフォーマンス オーバーヘッドがあります。

    CAST() を使用する場合

    以下に、それぞれの関数が最も適している状況の例を挙げます。 前述のように、CAST() は SQL-92 以降、ANSI SQL 標準の一部となっているため、異なる DBMS 間でより移植性が高いはずです (それが必要な場合)。

    また、CAST() が他の 2 つよりもパフォーマンスが優れていると主張する人もいます (3 つの関数すべてのパフォーマンスを比較している興味深い記事がこちらにあります)。

    しかし、CAST()よりもCONVERT()を使用することを好む(または必要とする)正当な理由もあります。

    いつ CONVERT()

    関数 CONVERT() が便利に使えるのは、style 引数を使用して、日付と文字列間の変換時に日付をどう書式化すべきかを指定しなければならない場合です。 以下に例を示します。

    DECLARE @date datetime2 = '2018-06-07 02:35:52.8537677';SELECT CONVERT(nvarchar(30), @date, 100) AS '100', CONVERT(nvarchar(30), @date, 101) AS '101', CONVERT(nvarchar(30), @date, 102) AS '102', CONVERT(nvarchar(30), @date, 103) AS '103';

    結果:

    +---------------------+------------+------------+------------+| 100 | 101 | 102 | 103 ||---------------------+------------+------------+------------|| Jun 7 2018 2:35AM | 06/07/2018 | 2018.06.07 | 07/06/2018 |+---------------------+------------+------------+------------+

    これはCONVERT()でなければできないことだからです。

    • CAST()style 引数をサポートしていません; そして
    • PARSE() は日付/時刻から文字列値に変換しません (これも style 引数をサポートしていません)

    いつ PARSE()

    この関数はさまざまなデメリットがありますが ( パフォーマンス、 .NET への依存性 ) 、この関数を使用することはお勧めします。.NET への依存、限られたデータ型変換)にもかかわらず、いくつかの利点もあり、これが唯一の選択肢となり得るシナリオもあります。 たとえば、2018 年 7 月 20 日金曜日のように、曜日名を含む日付を提供する場合です。

    When the others return an Error

    以下は、PARSE() が、エラーをスローせずに値の変換に成功する 3 つの関数のうちの唯一の関数の例です。 しかし、私たちが提供した文字列値には曜日名が含まれています。

    PARSE()

    SELECT PARSE('Friday, 20 July 2018' AS date) AS 'Result 1', PARSE('Fri, 20 July 2018' AS date) AS 'Result 2', PARSE('Friday 20 July 2018' AS date) AS 'Result 3';

    Result:

    +------------+------------+------------+| Result 1 | Result 2 | Result 3 ||------------+------------+------------|| 2018-07-20 | 2018-07-20 | 2018-07-20 |+------------+------------+------------+

    つまり、PARSE()は提供した日付の形式に対して問題がないことがわかります。

    CONVERT()

    SELECT CONVERT(date, 'Friday, 20 July 2018') AS 'Result 1', CONVERT(date, 'Fri, 20 July 2018') AS 'Result 2', CONVERT(date, 'Friday 20 July 2018') AS 'Result 3';

    Result:

    Conversion failed when converting date and/or time from character string.

    つまりCONVERT()はこのような形式の文字列だと変換できないんですね。

    CAST()

    SELECT CAST('Friday, 20 July 2018' AS date) AS 'Result 1', CAST('Fri, 20 July 2018' AS date)AS 'Result 2', CAST('Friday 20 July 2018' AS date) AS 'Result 3';

    Result:

    Conversion failed when converting date and/or time from character string.

    そしてCAST()は同じエラーを返します。

    ですからもし他の二つの関数でエラーが発生したら、代わりにPARSE()を試してみてください。

    カルチャーの指定

    文字列が提供されるカルチャー/言語を指定するときに、PARSE() 関数を使うことを好むかもしれないもう 1 つのシナリオがあります。 PARSE() にはオプションの引数があり、使用するカルチャを指定することができる。

    culture 引数を含めた例:

    SELECT PARSE('07/01/2018' AS date USING 'en-US') AS 'Result 1', PARSE('07/01/2018' AS date USING 'de-DE') AS 'Result 2';

    Result:

    +------------+------------+| Result 1 | Result 2 ||------------+------------|| 2018-07-01 | 2018-01-07 |+------------+------------+

    A Culture Alternative

    PARSE()でcultureを指定できる利点にもかかわらず、言語設定を変更する機能があるため、CAST()CONVERT() を使用して同じ効果を達成できる可能性があります。

    たとえば、クエリの前に SET LANGUAGE us_english を使用すると、現在の言語設定が us_english に変更されます。 これにより、(上記の例のように)クエリ内で異なる文化を指定することはできませんが、クエリ全体(および後続のクエリ)に影響を与えます。

    また、同じ方法で日付フォーマットの設定を変更することも可能です。 例えば、SET DATEFORMAT mdyのように。

    以下は、CAST()CONVERT() を使用してクエリを実行する前に言語設定を変更する例です:

    German:

    SET LANGUAGE German;SELECT CONVERT(date, '07/01/2018') AS 'Convert';SELECT CAST('07/01/2018' AS date) AS 'Cast';

    Result.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX:

    +------------+| Convert ||------------|| 2018-01-07 |+------------+Die Spracheneinstellung wurde in Deutsch geändert.+------------+| Cast ||------------|| 2018-01-07 |+------------+

    us_english:

    SET LANGUAGE us_english;SELECT CONVERT(date, '07/01/2018') AS 'Convert';SELECT CAST('07/01/2018' AS date) AS 'Cast';

    Result:

    +------------+| Convert ||------------|| 2018-07-01 |+------------+Changed language setting to us_english.+------------+| Cast ||------------|| 2018-07-01 |+------------+

    これを実行すると、セッションの言語/日付フォーマットの環境を変更することになることを忘れないでください。 元に戻すのを忘れないでください!

コメントを残す

メールアドレスが公開されることはありません。