続けて、データ型を変換する関数について紹介します。
型変換に関する関数一覧
関数名 | 戻り値 | 説明 |
---|---|---|
CAST | 指定したデータ型 | 別のデータ型に明示的に変換します(ISO準拠) |
CONVERT | 指定したデータ型 | 別のデータ型に明示的に変換します |
データ型を変換する関数(CAST、CONVERT)
データ型を変換するにはCAST関数、CONVERT関数を使用します。それぞれ「CAST(対象となる式 AS 変換後のデータ型)」「CONVERT(変換後のデータ型,対象となる式,変換時のスタイル:省略可)」という形式で記述します。
数値型から文字列型への変換例
SELECT CAST(18 AS varchar) + '才' /* → 18才 */
SELECT CONVERT(varchar,18) + '才' /* → 18才 */
CONVERT関数は、変換時のスタイルを指定する機能を備えています。CONVERT関数の第3引数には、スタイルを数字で指定することができます。よく利用するスタイルは下記の実行例の通りです(詳細についてはCONVERT関数のMSDNページをご覧ください)。
日付型から文字列への変換例
SELECT CAST(GETDATE() AS varchar)
/* → 09 30 2008 7:25PM */
SELECT CONVERT(varchar,GETDATE(),111)
/* → 2008/09/30 (yyyy/mm/dd) */
SELECT CONVERT(varchar,GETDATE(),11)
/* → 08/09/30 (yy/mm/dd) */
SELECT CONVERT(varchar,GETDATE(),112)
/* → 20080930 (yyyymmdd) */
SELECT CONVERT(varchar,GETDATE(),12)
/* → 080930 (yymmdd) */
SELECT CONVERT(varchar,GETDATE(),120)
/* → 2008-09-30 19:25:06 (yyyy-mm-dd hh:mi:ss) */
SELECT CONVERT(varchar,GETDATE(),121)
/* → 2008-09-30 19:25:06.007 (yyyy-mm-dd hh:mi:ss.mmm) */
SELECT CONVERT(varchar,GETDATE(),126)
/* → 2008-09-30T19:25:06.007 (yyyy-mm-ddThh:mi:ss.mmm ) */
文字列から日付型へ変換する際にも、スタイルを指定することができます。日本的な年月表記の場合には指定しなくても問題が起きないことがほとんどですが、アメリカ表記とイギリス表記のように同じレイアウトでも月と日が逆のような場合には、スタイルを指定する必要があります。
文字列から日付型への変換例
--文字列型を日付型に変換
SELECT CONVERT(datetime,'2008/12/31')
/* → 2008-12-31 (日本表記)*/
SELECT CONVERT(datetime,'12/31/2008',101)
/* → 2008-12-31 (アメリカ表記:mm/dd/yyyy)*/
SELECT CONVERT(datetime,'31/12/2008',103)
/* → 2008-12-31 (イギリス表記:dd/mm/yyyy)*/
変換先の型の長さを指定しない場合は、既定値として30という長さが設定されます。大きなサイズを扱う場合、正確にサイズを指定したい場合には、型名の後のカッコにて長さを指定します。
型と長さを意識した変換例
SELECT CONVERT(varchar(4),'ABC')
/* → 'ABC' (3桁) */
SELECT CONVERT(char(4),'ABC')
/* → 'ABC ' (4桁。固定長のため空白がセットされる) */
SELECT CONVERT(varchar(4),'あいう')
/* → 'あい' (2桁。バイト長のため最後の「う」は切れる) */
SELECT CONVERT(nvarchar(4),'あいう')
/* → 'あいう' (3桁。文字長のため3文字ともセットされる) */
--長さを指定しない場合
SELECT CAST('123456789012345678901234567890A' AS varchar)
SELECT CONVERT(varchar,'123456789012345678901234567890A')
/* → 123456789012345678901234567890 (既定の長さは30。最後のAが切れる) */