SQLで日付型データを文字列に変換する具体的な手法

SQLで日付型データを文字列に変換することは、さまざまなデータベースアプリケーションで頻繁に必要となります。異なるデータベース管理システム(DBMS)にはそれぞれ特有の関数やメソッドがあり、適切な手法を知ることが重要です。本記事では、MySQL、PostgreSQL、SQL Server、Oracle、SQLiteの各DBMSにおける具体的な変換方法について詳しく解説します。

文字列化は表示・出力のための処理です。保存、期間検索、日時順の並べ替えには原則として元の日時値を使います。書式記号はDBMSごとに違い、MySQLの%Mは月名、SQLiteの%Mは分です。SQL ServerのFORMATではMMが月、mmが分なので、そのまま使い回さないでください。

以下のSELECT例は、比較できるよう2024-05-23 14:59:30の固定値を使います。現在日時を取得する関数の実行結果を固定日付として示したものではありません。実際の列を使うときは、例の固定値を日時列に置き換えます。

目次

MySQLでの日付型データの文字列変換

MySQLでは、DATE_FORMAT関数を使用して日付型データを特定のフォーマットの文字列に変換できます。この関数は、さまざまなフォーマットをサポートしており、柔軟に日付形式を指定することができます。

DATE_FORMAT関数の使い方

DATE_FORMAT関数の基本構文は以下の通りです:

DATE_FORMAT(date, format)
  • date: 変換したい日付型データ
  • format: 変換後のフォーマットを指定する文字列

使用例

以下に、いくつかの具体例を示します:

  1. 年-月-日形式に変換する
SELECT DATE_FORMAT(CAST('2024-05-23 14:59:30' AS DATETIME), '%Y-%m-%d') AS formatted_date;

この固定値のクエリは日付を「2024-05-23」のような形式で出力します。

  1. 月/日/年形式に変換する
SELECT DATE_FORMAT(CAST('2024-05-23 14:59:30' AS DATETIME), '%m/%d/%Y') AS formatted_date;

この固定値のクエリは日付を「05/23/2024」のような形式で出力します。

  1. 曜日を含む形式に変換する
SELECT DATE_FORMAT(CAST('2024-05-23 14:59:30' AS DATETIME), '%W, %M %d, %Y') AS formatted_date;

この固定値のクエリは日付を「Thursday, May 23, 2024」のような形式で出力します。

フォーマット指定子の一覧

MySQLのDATE_FORMAT関数で使用できる主なフォーマット指定子は次の通りです:

  • %Y: 4桁の年(例: 2024)
  • %y: 2桁の年(例: 24)
  • %M: 月の完全な名前(例: January)
  • %m: 2桁の月(例: 05)
  • %d: 2桁の日(例: 23)
  • %H: 2桁の時(24時間表記、例: 14)
  • %i: 2桁の分(例: 59)
  • %s: 2桁の秒(例: 30)
  • %W: 曜日の名前(例: Thursday)

これらの指定子を組み合わせて、必要な形式に日付を変換できます。

次に、PostgreSQLでの日付型データの文字列変換方法について説明します。

曜日名・月名はlc_time_namesの設定に依存します。上記の英語名の出力例は英語設定を前提にしています。時刻まで出す書式は%Y-%m-%d %H:%i:%sです。日時を文字列へ変えても、それだけで別のタイムゾーンへ変換されるわけではありません。

PostgreSQLでの日付型データの文字列変換

PostgreSQLでは、TO_CHAR関数を使用して日付型データを特定のフォーマットの文字列に変換できます。この関数は、フォーマット指定子を使って柔軟に日付形式を指定することができます。

TO_CHAR関数の使い方

TO_CHAR関数の基本構文は以下の通りです:

TO_CHAR(date, format)
  • date: 変換したい日付型データ
  • format: 変換後のフォーマットを指定する文字列

使用例

以下に、いくつかの具体例を示します:

  1. 年-月-日形式に変換する
SELECT TO_CHAR(TIMESTAMP '2024-05-23 14:59:30', 'YYYY-MM-DD') AS formatted_date;

この固定値のクエリは日付を「2024-05-23」のような形式で出力します。

  1. 月/日/年形式に変換する
SELECT TO_CHAR(TIMESTAMP '2024-05-23 14:59:30', 'MM/DD/YYYY') AS formatted_date;

この固定値のクエリは日付を「05/23/2024」のような形式で出力します。

  1. 曜日を含む形式に変換する
SELECT TO_CHAR(TIMESTAMP '2024-05-23 14:59:30', 'FMDay, FMMonth DD, YYYY') AS formatted_date;

この固定値のクエリは日付を「Thursday, May 23, 2024」のような形式で出力します。

フォーマット指定子の一覧

PostgreSQLのTO_CHAR関数で使用できる主なフォーマット指定子は次の通りです:

  • YYYY: 4桁の年(例: 2024)
  • YY: 2桁の年(例: 24)
  • MM: 2桁の月(例: 05)
  • DD: 2桁の日(例: 23)
  • HH24: 2桁の時(24時間表記、例: 14)
  • MI: 2桁の分(例: 59)
  • SS: 2桁の秒(例: 30)
  • Day: 曜日の名前(例: Thursday)
  • Month: 月の名前(例: May)

これらの指定子を組み合わせて、必要な形式に日付を変換できます。

次に、SQL Serverでの日付型データの文字列変換方法について説明します。

DayやMonthは空白で埋められるため、上記ではそれぞれにFMを付けて余分な空白を抑えています。PostgreSQLのFMは次の書式要素だけに作用し、Oracleと同じ範囲に作用するわけではありません。時刻はHH24:MI:SSで表せます。

SQL Serverでの日付型データの文字列変換

SQL Serverでは、CONVERT関数やFORMAT関数を使用して日付型データを文字列に変換できます。それぞれの関数は異なる用途やフォーマット指定方法を提供します。

CONVERT関数の使い方

CONVERT関数の基本構文は以下の通りです:

CONVERT(varchar(length), date_value, style)
  • varchar: 変換後の文字列のデータ型
  • date: 変換したい日付型データ
  • style: フォーマットスタイルを指定する整数値

使用例

  1. 年-月-日形式に変換する
SELECT CONVERT(varchar(10), CONVERT(datetime2, '2024-05-23T14:59:30', 126), 23) AS formatted_date;

この固定値のクエリは日付を「2024-05-23」のような形式で出力します。

  1. 月/日/年形式に変換する
SELECT CONVERT(varchar(10), CONVERT(datetime2, '2024-05-23T14:59:30', 126), 101) AS formatted_date;

この固定値のクエリは日付を「05/23/2024」のような形式で出力します。

FORMAT関数の使い方

FORMAT関数の基本構文は以下の通りです:

FORMAT(value, format, culture)
  • value: 変換したい日付型データ
  • format: 変換後のフォーマットを指定する文字列
  • culture: 文化情報(省略可能)

使用例

  1. 年-月-日形式に変換する
SELECT FORMAT(CONVERT(datetime2, '2024-05-23T14:59:30', 126), 'yyyy-MM-dd', 'en-US') AS formatted_date;

この固定値のクエリは日付を「2024-05-23」のような形式で出力します。

  1. 月/日/年形式に変換する
SELECT FORMAT(CONVERT(datetime2, '2024-05-23T14:59:30', 126), 'MM/dd/yyyy', 'en-US') AS formatted_date;

この固定値のクエリは日付を「05/23/2024」のような形式で出力します。

  1. 曜日を含む形式に変換する
SELECT FORMAT(CONVERT(datetime2, '2024-05-23T14:59:30', 126), 'dddd, MMMM dd, yyyy', 'en-US') AS formatted_date;

この固定値のクエリは日付を「Thursday, May 23, 2024」のような形式で出力します。

フォーマットスタイルの一覧(CONVERT関数)

CONVERT関数で使用できる主なスタイルは次の通りです:

  • 101: MM/DD/YYYY(例: 05/23/2024)
  • 103: DD/MM/YYYY(例: 23/05/2024)
  • 104: DD.MM.YYYY(例: 23.05.2024)
  • 110: MM-DD-YYYY(例: 05-23-2024)
  • 111: YYYY/MM/DD(例: 2024/05/23)
  • 120: YYYY-MM-DD HH:MI:SS(例: 2024-05-23 14:30:00)

これらのスタイルを指定することで、CONVERT関数を使って日付をさまざまな形式の文字列に変換できます。

次に、Oracleでの日付型データの文字列変換方法について説明します。

varcharの長さは明示します。日付だけなら10文字、スタイル120の「yyyy-mm-dd hh:mi:ss」なら19文字が必要です。FORMATは.NETの書式を使い、cultureを省略するとセッション言語に依存します。上のFORMATの例ではen-USを指定しています。FORMATはCLRに依存するため、大量行の出力ではCONVERTやアプリ側整形も比較し、速度を決めつけず測定してください。

Oracleでの日付型データの文字列変換

Oracleでは、TO_CHAR関数を使用して日付型データを特定のフォーマットの文字列に変換できます。この関数は、柔軟なフォーマット指定をサポートしており、日付データをさまざまな形式の文字列に変換することができます。

TO_CHAR関数の使い方

TO_CHAR関数の基本構文は以下の通りです:

TO_CHAR(date, format)
  • date: 変換したい日付型データ
  • format: 変換後のフォーマットを指定する文字列

使用例

以下に、いくつかの具体例を示します:

  1. 年-月-日形式に変換する
SELECT TO_CHAR(TIMESTAMP '2024-05-23 14:59:30', 'YYYY-MM-DD') AS formatted_date FROM dual;

この固定値のクエリは日付を「2024-05-23」のような形式で出力します。

  1. 月/日/年形式に変換する
SELECT TO_CHAR(TIMESTAMP '2024-05-23 14:59:30', 'MM/DD/YYYY') AS formatted_date FROM dual;

この固定値のクエリは日付を「05/23/2024」のような形式で出力します。

  1. 曜日を含む形式に変換する
SELECT TO_CHAR(TIMESTAMP '2024-05-23 14:59:30', 'FMDay, Month DD, YYYY', 'NLS_DATE_LANGUAGE=English') AS formatted_date FROM dual;

この固定値のクエリは日付を「Thursday, May 23, 2024」のような形式で出力します。

フォーマット指定子の一覧

OracleのTO_CHAR関数で使用できる主なフォーマット指定子は次の通りです:

  • YYYY: 4桁の年(例: 2024)
  • YY: 2桁の年(例: 24)
  • MM: 2桁の月(例: 05)
  • MON: 月の略称(例: MAY)
  • MONTH: 月の完全な名前(例: MAY)
  • DD: 2桁の日(例: 23)
  • D: 曜日番号(1~7。週の開始日はNLS_TERRITORYに依存)
  • DAY: 曜日の完全な名前(例: THURSDAY)
  • HH24: 24時間表記の時(例: 14)
  • MI: 2桁の分(例: 59)
  • SS: 2桁の秒(例: 30)

これらの指定子を組み合わせることで、必要な形式に日付を変換できます。

次に、SQLiteでの日付型データの文字列変換方法について説明します。

曜日・月名はNLS_DATE_LANGUAGEに依存するため、英語の例では第3引数を明示しています。FMは空白やゼロ埋めを抑える修飾子で、Oracleでは後続の書式にも作用します。常に2桁の日を必要とする用途では、FMを含む表示用書式をそのまま使わず、YYYY-MM-DDなど目的に合う書式を選びます。

SQLiteでの日付型データの文字列変換

SQLiteには専用の日付・時刻型がありません。対応する形式の文字列、ユリウス日、Unix時刻などを日付関数で扱います。strftimeは対応する書式で文字列を返しますが、C言語などのstrftimeの全指定子を使えるわけではありません。

strftime関数の使い方

strftime関数の基本構文は以下の通りです:

strftime(format, date)
  • format: 変換後のフォーマットを指定する文字列
  • date: 変換したい日付型データ

使用例

以下に、いくつかの具体例を示します:

  1. 年-月-日形式に変換する
SELECT strftime('%Y-%m-%d', '2024-05-23 14:59:30') AS formatted_date;

この固定値のクエリは日付を「2024-05-23」のような形式で出力します。

  1. 月/日/年形式に変換する
SELECT strftime('%m/%d/%Y', '2024-05-23 14:59:30') AS formatted_date;

この固定値のクエリは日付を「05/23/2024」のような形式で出力します。

  1. 曜日を含む形式に変換する
SELECT strftime('%w, %Y-%m-%d', '2024-05-23 14:59:30') AS formatted_date;

この固定値のクエリは日付を「4, 2024-05-23」のような形式で出力します。

フォーマット指定子の一覧

SQLiteのstrftime関数で使用できる主なフォーマット指定子は次の通りです:

  • %Y: 4桁の年(例: 2024)
  • %m: 2桁の月(例: 05)
  • %d: 2桁の日(例: 23)
  • %H: 2桁の時(24時間表記、例: 14)
  • %M: 2桁の分(例: 59)
  • %S: 2桁の秒(例: 30)
  • %w: 曜日番号(0: 日曜日, 6: 土曜日)
  • %W: 曜日の完全な名前(例: Thursday)

これらの指定子を組み合わせて、必要な形式に日付を変換できます。

最後に、各DBMSにおける日付型データを文字列に変換する方法を総括し、適切な関数の選択と使い方のポイントをまとめます。

SQLiteの%yと%Bはここで使える指定子ではありません。未対応・未定義の指定子を含むと結果がNULLになります。月名が必要ならアプリ側で整形するか、明示的な対応表を用意します。曜日番号%wは日曜0~土曜6です。%Wは月曜始まりの週番号で、曜日名ではありません。

SELECT strftime('%Y-%m-%d %H:%M:%S', '2024-05-23 14:59:30') AS date_time,
       strftime('%Y-%m-%d', NULL) AS null_input,
       strftime('%B', '2024-05-23') AS unsupported_format;

結果はdate_timeが「2024-05-23 14:59:30」、null_inputとunsupported_formatがNULLです。NULLが返ったときは入力欠損だけでなく、書式や対応バージョンも確認します。

SELECT datetime(0, 'unixepoch') AS epoch_utc,
       strftime('%Y-%m-%d %H:%M:%S',
                '2024-05-23 00:30:00+09:00') AS utc_time;

結果はepoch_utcが「1970-01-01 00:00:00」、utc_timeが「2024-05-22 15:30:00」です。Unix秒を渡すときはunixepoch修飾子を明示します。nowはUTCで、localtimeは実行環境のローカル時刻への変換です。日本語のデータベース名や画面表示だけで日本時間になるわけではありません。

日時を文字列にする前の注意点

MM/DD/YYYYのような表示用文字列を並べ替えても、年をまたぐ日時順にはなりません。ORDER BYには元の日時列を指定します。またWHEREで日時列のすべての行を文字列へ変換するより、元の列と型をそろえた開始・終了値で範囲条件を指定する方法を検討してください。インデックスの効果は実行計画で確認します。

日付だけにすると時刻が、秒までにすると小数秒が、タイムゾーンなしにするとオフセット情報が失われます。これは元の列を書き換えることとは別ですが、出力文字列だけでは元の情報を復元できない場合があります。データ連携では必要な精度とタイムゾーンを先に決めます。

MySQL・PostgreSQL・SQL Server・Oracleでは日時型とセッション設定の組み合わせで扱いが異なります。本記事の固定値は基本書式を比較するもので、各DBMSの現在時刻関数が同じ瞬間・同じタイムゾーンで動くことを示してはいません。

まとめ

各データベース管理システム(DBMS)での日付型データを文字列に変換する方法について解説してきました。以下に、それぞれのDBMSで使用する関数と主要なポイントをまとめます:

  • MySQL: DATE_FORMAT関数を使用し、フォーマット指定子を利用して日付を文字列に変換します。例として、'%Y-%m-%d'や'%M %d, %Y'などがあります。
  • PostgreSQL: TO_CHAR関数を使用し、フォーマット指定子を組み合わせて日付を文字列に変換します。例として、'YYYY-MM-DD'や'MM/DD/YYYY'などがあります。
  • SQL Server: CONVERT関数やFORMAT関数を使用し、スタイルコードやフォーマット文字列を指定して日付を文字列に変換します。例として、101や'yyyy-MM-dd'などがあります。
  • Oracle: TO_CHAR関数を使用し、豊富なフォーマット指定子を利用して日付を文字列に変換します。例として、'YYYY-MM-DD'や'Day, Month DD, YYYY'などがあります。
  • SQLite: strftime関数を使用し、フォーマット指定子を活用して日付を文字列に変換します。例として、'%Y-%m-%d'や'%m/%d/%Y'などがあります。

各DBMSの特有の関数とフォーマット指定子を理解し、適切に使いこなすことで、日付型データを必要な形式の文字列に変換することができます。この知識は、レポート作成やデータ分析、システム間のデータ連携など、さまざまな場面で役立ちます。

公式リファレンスと確認範囲

参照:MySQLの日付関数、PostgreSQLの書式関数、SQL ServerのCAST/CONVERTとFORMAT、OracleのTO_CHARと書式モデル、SQLiteの日付・時刻関数。

SQLite節の5つのSELECT例はSQLite 3.53.1で実行し、上記の出力とNULLを確認しています。他の4製品の例は公式仕様との照合であり、この検証で実行したものではありません。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次