Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

CONVERT

与えられた式を、特定のデータ型に変換する関数です。

Synopsis

CONVERT(datatype,expression[,format-code])

{fn CONVERT(expression,datatype)}

引数

expression 変換する式。
datatype の変換後のデータ型。
format-code オプション — 日付および時刻の形式を指定する整数コード。date/time/timestamp データ型と文字データ型の変換に使用します。この引数は、一般的なスカラ構文形式でのみ使用します。

概要

ここでは、CONVERT 関数の 2 種類の実装について説明します。いずれも特定のデータ型の式を別のデータ型の対応値に変換します。両方とも、日付と時刻の変換を実行します。

Note:

これら 2 種類の CONVERT の実装では、引数の表示順序が異なります。1 つ目は、MS SQL Server との互換性がある Caché の汎用スカラ関数で、引数は 3 つです。2 つ目は、引数が 2 つの Caché ODBC スカラ関数です。これ以降は、これら 2 種類の形式の CONVERT のそれぞれについて説明します。

  • CONVERT(datatype,expression) 関数は、ストリーム・データの変換をサポートします。例えば、文字ストリーム・フィールドのコンテンツをデータ型 VARCHAR の文字列に変換できます。

  • {fn CONVERT(expression,datatype)} は、ストリーム・データの変換はサポートしません。expression にストリーム・フィールドを指定すると、SQLCODE -37 エラーになります。

CONVERT のいずれかのバージョンに無効な値を指定すると、SQLCODE -141 が発生します。

expression が、定義されたデータ型 (例えば Caché ObjectScript によって提供されるホスト変数) を持たない場合、そのデータ型は既定で文字列データ型に設定されます。

Caché SQL でサポートされているデータ型の一覧については、"データ型" を参照してください。これ以外のデータ型変換は、"CAST" 関数を参照してください。

CONVERT(datatype,expression,format-code)

これは、MS SQL Server 互換関数です。文字ストリーム・データを含む、有効な Caché SQL データ型を datatype として取ります。Caché SQL でサポートされているデータ型の一覧については、"データ型" を参照してください。

文字列は、expression 文字列長より短い出力文字列長を指定し、VARCHAR-to-VARCHAR 変換を実行することで切り捨てることができます。

CONVERT (または CAST) を使用している場合、文字列データ型 (CHAR または VARCHAR など) の長さが指定されていないと、最大長は既定で 30 文字になります。長さの指定されていないバイナリ データ型 (BINARY または VARBINARY など) では、最大長は既定で 30 文字になります。または、長さの指定されていないデータ型は、データ型テーブルに示すように、MAXLEN が 1 の文字にマップされます。

BIT データ型変換を実行できます。許容される値は、1、0、または NULL です。その他の値を指定すると、Caché によって SQLCODE -141 エラーが発行されます。以下の埋め込み SQL の例では、両方が NULL の BIT 変換になります。

  SET a=""
  &sql(SELECT CONVERT(BIT,:a),
       CONVERT(BIT,NULL)
       INTO :x,:y)
  WRITE !,"SQLCODE=",SQLCODE
  WRITE !,"the host variable is:",x
  WRITE !,"the NULL keyword is:",y

オプションの format-code 引数は、date、datetime、time のいずれかの形式を指定します。この形式は、date/time/timestamp データ型から文字列への変換時の出力の定義、あるいは、文字列から date/time/timestamp データ型への変換時の入力の定義に使用できます。以下のフォーマット・コードがサポートされます。2 桁の年を出力するフォーマット・コードを最初の列に示し、4 桁の年を出力するフォーマットまたは年を出力しないフォーマットを 2 列目に示します。

2 桁の年コード 4 桁の年コード 形式
  0 または 100 Mon dd yyyy hh:mmAM (または PM)
1 101 mm/dd/yy
2 102 yy.dd.mm
3 103 dd/mm/yy
4 104 dd.mm.yy
5 105 dd-mm-yy
6 106 dd Mon yy
7 107 Mon dd, yy (dd < 10 のとき先頭に 0 は入りません)
  8 または 108 hh:mm:ss
  9 または 109 Mon dd yyyy hh:mm:ss:nnnAM (または PM)
10 110 mm-dd-yy
11 111 yy.mm.dd
12 112 yymmdd
  13 または 113 dd Mon yyyy hh:mm:ss:nnn (24 時間制)
  14 または 114 hh:mm:ss.nnn (24 時間制)
  20 または 120 yyyy-mm-dd hh:mm:ss (24 時間制)
  21 または 121 yyyy-mm-dd hh:mm:ss.nnnn (24 時間制)
  126 yyyy-mm-ddThh:mm:ss.nnnn (24 時間制)
  130 dd Mon yyyy hh:mm:ss:nnnAM (または PM)
  131 dd/mm/yyyy hh:mm:ss:nnnAM (または PM)

日付と時刻の変換機能を以下に示します。

  • 値の範囲 : 許容される日付の範囲は 1840-12-31 ~ 9999-12-31 です。

  • 既定値:

    • 時刻値を TIMESTAMP、DATETIME、または SMALLDATETIME に変換すると、日付は既定で 1900-01-01 になります。{fn CONVERT()} では、日付は既定で現在の日付になることに注意してください。

    • 日付値を TIMESTAMP、DATETIME、または SMALLDATETIME に変換すると、時刻は既定で 00:00:00 になります。

  • 既定のフォーマット : format-code が指定されていない場合に CONVERT を実行すると、指定されている値からフォーマットを決定しようとします。フォーマットを決定できない場合には、format-code が既定で 100 に設定されます。

  • 2 桁の年 : 00 ~ 49 までの 2 桁の年は 21 世紀の日付 (例えば 2000 ~ 2049 年) に変換され、50 ~ 99 までの 2 桁の年は 20 世紀の日付 (例えば 1950 ~ 1999 年) に変換されます。

  • 秒の小数部 : 秒の小数部の前には、ピリオド (.) とコロン (:) のいずれかを付けることができます。これらの記号は、意味が異なります。

    • 既定値はピリオドで、すべての形式コードで使用できます。ピリオドは標準的な小数を示すため、12:00:00.4 は 10 分の 4 秒を示し、12:00:00.004 は 1000 分の 4 秒を示します。小数部の精度の桁数に制限はありません。

    • コロンは、9/109、13/113、130、および 131 の format-code 値でのみ使用できます。コロンは、それに続く数値が 1000 分の 1 秒単位であることを示すため、12:00:00:4 は 1000 分の 4 秒を示します (12:00:00.004)。コロンの後に続けることができる桁数は 3 に制限されています。

無効な形式または format-code に一致しない形式で expression を指定すると、SQLCODE -141 エラーが生成されます。存在しない format-code を指定すると、1900-01-01 00:00:00 が返されます。

{fn CONVERT(expression,datatype)}

これは、ODBC スカラ関数です。以下の ODBC の明示的データ型変換をサポートします。この形式の CONVERT では、データ型変換を指定する "SQL_" キーワードを使用する必要があります。2 つのグループの変換データ型が存在する以下のテーブルにおいて、最初のグループはデータ値とデータ型の両方を変換します。2 番目のグループはデータ型を変換しますが、データ値は変換しません。

ソース 変換
任意の数値データ型 SQL_VARCHAR、SQL_DOUBLE、SQL_DATE、SQL_TIME
%String SQL_DATE、SQL_TIME、SQL_TIMESTAMP
%Date

SQL_VARCHAR、SQL_TIMESTAMP

SQL_INTEGER、SQL_BIGINT、SQL_SMALLINT、SQL_TINYINT、SQL_DATE

%Time

SQL_VARCHAR、SQL_TIMESTAMP

SQL_VARCHAR、SQL_INTEGER、SQL_BIGINT、SQL_SMALLINT、SQL_TINYINT、SQL_TIME

%TimeStamp

SQL_DATE、SQL_TIME

SQL_VARCHAR、SQL_INTEGER、SQL_BIGINT、SQL_SMALLINT、SQL_TINYINT

任意の非ストリーム・データ型 SQL_INTEGER、SQL_BIGINT、SQL_SMALLINT、SQL_TINYINT
任意の非ストリーム・データ型 SQL_DOUBLE

SQL_VARCHAR は標準的な ODBC 表現です。SQL_VARCHAR に変換する場合、日時は適切な ODBC 表現に変換されます。つまり、数値のデータタイプは文字列に変換されます。SQL_VARCHAR から変換する場合、値は有効な ODBC Time、Timestamp、Date 表現である必要があります。

  • 時刻値を SQL_TIMESTAMP に変換すると、日付は既定で現在の日付になります。CONVERT() では、日付は既定で 1900-01-01 になることに注意してください。

  • 日付値を SQL_TIMESTAMP に変換すると、時刻は既定で 00:00:00 になります。

この構文形式では、秒の小数部の前には、ピリオド (.) とコロン (:) のいずれかを付けることができます。これらの記号は、意味が異なります。ピリオドは標準的な小数を示すため、12:00:00.4 は 10 分の 4 秒を示し、12:00:00.004 は 1000 分の 4 秒を示します。コロンは、それに続く値が 1000 分の 1 秒単位であることを示すため、12:00:00:4 は 1000 分の 4 秒を示します。コロンの後に続けることができる桁数は 3 に制限されています。

整数データ型または SQL_DOUBLE データ型に変換する場合は、日付および時刻も含めてデータ値が数値表記に変換されます。SQL_DATE は1841年1月1日以降の日数を、SQL_TIME は午前0時からの秒数を示します。非数値文字が検出されると、入力文字列が切り捨てられます。整数データ型では、小数点以下桁数が切り捨てられ、数値の整数部分のみが返されます。

{fn CONVERT(expression,datatype)} は、ストリーム・データの変換はサポートしません。expression にストリーム・フィールドを指定すると、SQLCODE -37 エラーになります。

NULL はどのデータ型に変換されても NULL のままです。

空文字列 ('')、あるいは非数値文字列値は以下のように変換されます。

  • SQL_VARCHAR と SQL_TIMESTAMP は、入力された値を返します。

  • 数値データ型は、0 (ゼロ) に変換されます。

  • SQL_DATE と SQL_TIME は NULL に変換されます。

これ以外のデータ型変換は、"CAST" 関数を参照してください。

CONVERT クラス・メソッド

“SQL_” キーワードを使用してデータ型を指定して、CONVERT()Opens in a new tab メソッド呼び出しを使用して、データ型変換を実行することもできます。

$SYSTEM.SQL.CONVERT(expression,convert-to-type,convert-from-type)

以下に例を示します。

  WRITE $SYSTEM.SQL.CONVERT(60945,"SQL_VARCHAR","SQL_DATE")

CONVERT() の例

以下の例では、CONVERT の Caché スカラ構文形式を使用しています。

以下の例では、DECIMAL と DOUBLE のデータ型を使用した小数の変換を比較します。

SELECT CONVERT(DECIMAL,-123456789.0000123456789) AS DecimalVal,
       CONVERT(DOUBLE,-123456789.0000123456789) AS DoubleVal

以下の例では、文字ストリーム・フィールドを VARCHAR テキスト文字列に変換します。また、CHAR_LENGTH を使用して、文字ストリーム・フィールドの長さを表示します。

SELECT Notes,CONVERT(VARCHAR(80),Notes) AS NoteText,CHAR_LENGTH(Notes) AS TextLen
FROM Sample.Employee WHERE Notes IS NOT NULL

以下の例では、誕生日フィールド (DOB) から形式設定された文字列への複数の変換を示します。

SELECT DOB,
       CONVERT(VARCHAR(20),DOB) AS DOBDefault,
       CONVERT(VARCHAR(20),DOB,100) AS DOB100,
       CONVERT(VARCHAR(20),DOB,107) AS DOB107,
       CONVERT(VARCHAR(20),DOB,114) AS DOB114,
       CONVERT(VARCHAR(20),DOB,126) AS DOB126
FROM Sample.Person

既定の形式とコード 100 の形式は同じです。DOB フィールドには時刻値が格納されていないため、時刻を表示する形式 (ここでは、既定値、100、114、126) では、12:00AM (真夜中) を示すゼロ値が指定されます。コード 126 の形式は、日付と時刻の文字列を空白なしで表示します。

{fn CONVERT()} の例

以下の例では、CONVERT の ODBC 構文形式を使用しています。

以下の埋め込み SQL の例では、混合文字列が整数に変換されます。Caché では、最初の数値以外の文字で文字列を切り捨て、結果として得られる数値をキャノニック形式に変換します。

  SET a="007 James Bond"
  &sql(SELECT {fn CONVERT(:a,SQL_INTEGER)} INTO :x)
  WRITE !,"SQLCODE=",SQLCODE
  WRITE !,"the host variable is:",x

整数 7 が返されます。

以下の例は、"DOB" (誕生日) 列の日付を、SQL_TIMESTAMP データ型に変換します。

SELECT DOB,{fn CONVERT(DOB,SQL_TIMESTAMP)} AS DOBtoTstamp
     FROM Sample.Person

ここで得られるタイムスタンプは、yyyy-mm-dd hh:mm:ss 形式で表されます。

以下の例は、"DOB" (誕生日) 列の日付を、SQL_INTEGER データ型に変換します。

SELECT DOB,{fn CONVERT(DOB,SQL_INTEGER)} AS DOBtoInt
     FROM Sample.Person

生成される整数は 1840 年 12 月 31 日からの、$HOROLOG カウントになります。

以下の例は、DOB (誕生日) 列の日付を、SQL_VARCHAR データ型に変換します。

SELECT DOB,{fn CONVERT(DOB,SQL_VARCHAR)} AS DOBtoVChar
     FROM Sample.Person

ここで得られる文字列は yyyy-mm-dd 形式で表されます。

関連項目

FeedbackOpens in a new tab