sql >> データベース >  >> RDS >> Sqlserver

SQL ServerのPARSE()とCAST()とCONVERT()の違い:違いは何ですか?

    おそらく、T-SQLのPARSE()に遭遇したことがあります。 、CAST() 、およびCONVERT() SQL Serverを操作するときに機能し、違いは何であるか疑問に思いました。 3つの機能はすべて同じことをしているように見えますが、それらの間には微妙な違いがあります。

    この記事では、これらの機能の主な違いについて概説します。

    比較

    CONVERT()の主な違いの概要を示す表を次に示します。 、CAST() 、およびPARSE() SQL Serverの関数:

    CONVERT() CAST() PARSE()
    公式定義 あるデータ型の式を別のデータ型に変換します。 あるデータ型の式を別のデータ型に変換します。 式の結果を返し、SQLServerで要求されたデータ型に変換されます。
    許容値 任意の有効な式。 任意の有効な式。 文字列。
    戻り値 2番目の引数、1番目の引数で指定された要求されたデータ型に変換されます。 1番目の引数、2番目の引数によって提供される要求されたデータ型に変換されます。 1番目の引数、2番目の引数によって提供される要求されたデータ型に変換されます。
    サポートされている変換 任意の2つのデータ型間。 任意の2つのデータ型間。 文字列から日付/時刻および数値タイプのみ。
    スタイルを受け入れる 議論? はい。 いいえ。 いいえ。
    文化を受け入れる 議論? いいえ。 いいえ。 はい。
    .NET Frameworkが必要ですか? いいえ。 いいえ。 はい。

    上記の表に加えて、他のいくつかのポイント:

    • Microsoftのドキュメントでは、PARSE()と指摘されています。 リモート化されません(CLRの存在に依存するため)。 CLRを必要とする機能をリモート処理すると、リモートサーバーでエラーが発生します。
    • PARSE()の値がいくつかあります 処理できますが、CAST() およびCONVERT() できません(たとえば、特定の日付形式を使用する文字列)。
    • CAST() ANSISQL-92規格に含まれています。
    • CAST()と主張する人もいます 他の2つよりもパフォーマンスが優れています。
    • 文字列値を解析する場合、特定のパフォーマンスオーバーヘッドがあります。したがって、PARSE() 通常、他の2つよりも実行速度が遅くなります。

    以下は、各機能が最も適している状況の例です。

    CAST()を使用する場合

    CAST()を使用するための良い議論をすることができます 以下にリストされていないシナリオの場合。前述のように、CAST() SQL-92以降ANSISQL標準の一部であるため、異なるDBMS間でより移植性が高いはずです(それが要件である場合)。

    また、CAST() 他の2つよりもパフォーマンスが優れています(3つの機能すべてのパフォーマンスを比較した興味深い記事があります)。

    ただし、CONVERT()の使用を希望する(または必要とする)正当な理由もあります。 CAST()を介して 。

    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への依存、データ型の変換の制限)がありますが、いくつかの利点もあり、唯一の選択肢となるシナリオもあります。たとえば、2018年7月20日金曜日のように、曜日の名前を含む日付を指定する場合 。

    他の人がエラーを返したとき

    PARSE()の例を次に示します。 エラーをスローせずに値を正常に変換できる3つの関数の中で唯一の関数です。

    これらの例では、さまざまな文字列値を日付に変換しようとしています。 データ・タイプ。ただし、提供する文字列値には曜日名が含まれます。これにより、CAST()で問題が発生します およびCONVERT() 、ただしPARSE() 問題ありません。

    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 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';
    

    結果:

    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';
    

    結果:

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

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

    したがって、他の2つの関数でエラーが発生した場合は、PARSE()を試してください。 代わりに。

    文化の特定

    PARSE()を使用したい別のシナリオ 関数は、文字列が提供されるカルチャ/言語を指定する場合です。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 1   | Result 2   |
    |------------+------------|
    | 2018-07-01 | 2018-01-07 |
    +------------+------------+
    

    文化の代替案

    PARSE()でカルチャを指定できるという利点はありますが 、言語設定を変更する機能があります。つまり、CAST()を使用しても同じ効果が得られます。 またはCONVERT()

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

    同じ方法で日付形式の設定を変更することもできます。たとえば、SET DATEFORMAT mdy

    CAST()でクエリを実行する前に言語設定を変更する例を次に示します。 およびCONVERT()

    ドイツ語:

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

    結果:

    +------------+
    | 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';
    

    結果:

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

    これを行うと、セッションの言語/日付形式の環境が変更されることに注意してください。元に戻すことを忘れないでください!


    1. SQLServerのTempDBファイルの場所の変更

    2. Oracleでのページネーションのベストプラクティスは?

    3. SQLPLUSを使用してCSV形式のファイルにスプールするにはどうすればよいですか?

    4. MySQLでUTF8文字を保存する方法