STEP 6. 関数
6.2 データ型の変換関数: CONVERT、CAST
今度はエラーにはならず、正しく文字列が連結されていることを確認できます。
なお、FORMAT 関数を利用する場合は、「FORMAT(hiredate, 'yyyy 年')」と記述するこ とで同じ結果を取得することができます(FORMAT 関数の戻り値は nvarchar のため)。
CAST 関数
3. 次に、CONVERT 関数の代わりに、CAST 関数を利用してみましょう。
SELECT CAST( DATEPART(year, hiredate) AS char(4) ) + '年', * FROM emp
同じ結果を取得できたことを確認できます。CAST 関数では、引数が 1 つのみで、変換した いデータの後に「AS」を記述することに注意してください。
CONVERT による日付書式の変換(文字列への変換)
次に、CONVERT 関数を利用して、日付と時刻を文字列へ変換してみましょう。
4. まずは、「emp」テーブルの「hiredate」(入社日)列を varchar データ型へ変換してみま す。
SELECT CONVERT( varchar, hiredate ), * FROM emp
変換先のデータ型には、“varchar” とだけ指定し、最大バイト数を指定していませんが、この 場合は変換元の最大サイズに合わせて自動調整してくれます。これで日付を文字列へ変換する ことができます。しかし、結果は「月 日 年 時間」(MM DD YYYY)の順に表示されていま す。これを「年/月/日」(YYYY/MM/DD)の順で表示されるようにするには、CONVERT の 第3引数で「111」または「11」を指定するようにします。
5. それでは、CONVERT 関数の第3引数へ「111」を指定して試してみましょう。
SELECT CONVERT( varchar, hiredate, 111 ), * FROM emp
結果は、YYYY/MM/DD 形式で表示されていることを確認できます。このように CONVERT 関数の第3引数では、各国の日付/時刻表示に合わせた変換が行えるようになっています。
なお、FORMAT 関数を利用する場合は、「FORMAT(hiredate, 'yyyy/MM/dd')」と記述 することで同じ結果を取得することができます。
6. 次に、CONVERT 関数の第3引数へ「114」を指定して、実行してみます。
SELECT CONVERT( varchar, hiredate, 114 ), * FROM emp
結果は、時刻のみを取得できていることを確認できます。CONVERT 関数の第 3 引数では、
「114」または「14」を指定すると、時刻のみを取得できるようになります。
なお、FORMAT 関数を利用する場合は、「FORMAT(hiredate, 'HH:mm:ss.fff')」と記述 することで同じ結果を取得することができます。
Note: CONVERT の第3引数で指定できる値
CONVERT 関数の第 3 引数で指定できる値は、SQL Server オンライン ブックの「SQL Server データベース エンジン」→「Transact-SQL リファレンス」→「組み込み関数」→「変換関数」→「CAST および CONVERT」
トピックに記載されています。このトピックへは、クエリ エディターで CONVERT 関数を選択した状態で [F1]
キーを押下すると、自動的にオンライン ブックが開いて、このトピックへジャンプすることもできます。
Note: int データ型に対する数値演算の結果が int データ型になることに注意
int データ型に格納したデータに対して、数値演算(除算や集計関数で計算するなど)を行うと、計算結果も int デ ータ型なることに注意する必要があります。たとえば、集計関数の AVG(平均を取得できる関数)を利用して、
平均を計算したとしても、結果は int データ型になってしまいます。これでは、計算結果に小数点以下の値があっ た場合に、その値は切り捨てられてしまいます。
これは、「emp」テーブルの「sal」(給与)列を利用して試すことができます。この列に対して、AVG 関数を利用 して、全社員の平均給与を計算してみます(AVG 関数については、本自習書シリーズの「SQL 基礎の基礎」で説 明しています)。
SELECT AVG(sal) FROM emp
計算結果は「366999」となり、小数点以下の値が切り捨てられています。小数点以下の値が切り捨てられないよ うにするには、次のように CONVERT 関数を利用して、計算対象となる値を float や decimal データ型など、
小数点以下を扱えるデータ型へ変換するようにします。
SELECT AVG( CONVERT( float, sal) ) FROM emp
計算結果は「366999.8」となり、小数点以下の値を取得できたことを確認できます。
なお、次のように AVG 関数による計算結果に対して、float型へ変換する場合は、小数点以下を取得することは できません。
SELECT CONVERT( float, AVG(sal) ) FROM emp
小数点以下の値を取得したい場合は、あくまでも計算前に(計算対象となるデータを)変換しておくことに注意し てください。