Snowflake「Date is not recognized」エラーの原因とTO_DATE/TRY_TO_DATEの使い分け

Snowflakeの「Date is not recognized」エラー解説アイキャッチ。発生原因とTO_DATE関数およびTRY_TO_DATE関数の使い分け、日付フォーマット指定の正解をやさしくまとめた技術解説の主題を示すビジュアル Snowflake
この記事をシェアする𝕏B!FacebookLINEPocket

はじめに:なぜ「Date is not recognized」が出るの?

Snowflakeを使っていて、こんなエラーに出くわしたことはありませんか?

Date '2026/05/18' is not recognized

「えっ、ふつうの日付なのに何がダメなの?」と戸惑う方も多いはずです。実はこのエラー、文字列を日付として読み込もうとしたときに、Snowflakeが想定するフォーマットと一致していないことが原因で発生します。今回はその仕組みと、TO_DATE/TRY_TO_DATE の正しい使い分けまで、初心者向けにフレンドリーに解説していきますね。

Snowflakeで「Date '2026/05/18' is not recognized」エラーが発生する仕組みを示す図解。デフォルトのISO 8601形式と一致しない文字列日付がTO_DATE関数で弾かれる流れと、TRY_TO_DATEとの違いを整理したイメージ

エラーの正体:Snowflakeが受け付けるデフォルトの日付形式

Snowflakeはデフォルトで、ISO 8601形式(例: 2026-05-18)を「日付」として認識します。一方で 2026/05/1818-MAY-2026 のような書き方はそのままでは受け付けてくれません。

たとえば次のSQLを実行すると、冒頭のエラーが返ってきます。

SELECT TO_DATE('2026/05/18');
-- Date '2026/05/18' is not recognized

これは「Snowflakeが悪い」のではなく、「どんなフォーマットの文字列か教えてあげていない」のが原因です。日本のシステムでよく使われる YYYY/MM/DDYYYYMMDD は、明示的に指定しないと読めません。

解決策その1:TO_DATEにフォーマットを指定する

もっともシンプルな解決法は、TO_DATE の第2引数にフォーマット文字列を渡してあげることです。

-- スラッシュ区切り
SELECT TO_DATE('2026/05/18', 'YYYY/MM/DD');

-- 8桁数字
SELECT TO_DATE('20260518', 'YYYYMMDD');

-- 日本語表記混じり
SELECT TO_DATE('2026年05月18日', 'YYYY"年"MM"月"DD"日"');

フォーマット指定子は YYYY(4桁年)、MM(2桁月)、DD(2桁日)が基本です。詳しい一覧はSnowflake公式の変換関数ドキュメントを参照してください。

解決策その2:DATE_INPUT_FORMATをセッションで設定する

「毎回フォーマットを書くのは面倒…」という場合は、セッションパラメータ DATE_INPUT_FORMAT を変えてしまう方法もあります。

ALTER SESSION SET DATE_INPUT_FORMAT = 'YYYY/MM/DD';

SELECT TO_DATE('2026/05/18');  -- これでもOKに!

デフォルト値は AUTO で、Snowflakeが推測してくれる代表的な形式に対応します。決まった形式の文字列を大量に読み込む場合に便利です。

TO_DATE と TRY_TO_DATE の使い分け

ここからが本題。Snowflakeには TO_DATETRY_TO_DATE という似た関数が2つあります。違いはとてもシンプルです。

  • TO_DATE: 変換に失敗したらエラーで止まる
  • TRY_TO_DATE: 変換に失敗したらNULLを返して処理を続ける

SnowflakeのTO_DATEとTRY_TO_DATEの挙動の違いを比較した図解で、変換失敗時にエラーで停止するTO_DATEと、NULLを返して処理を継続するTRY_TO_DATEの分岐をフロー形式で示した使い分けイメージ

実際の挙動を比べてみましょう。

-- 失敗するとクエリ全体がエラーで止まる
SELECT TO_DATE('not-a-date', 'YYYY-MM-DD');
-- → エラー!

-- 失敗しても NULL を返してくれる
SELECT TRY_TO_DATE('not-a-date', 'YYYY-MM-DD');
-- → NULL

使い分けの目安

  • マスタデータなど、絶対に変換できるはずのデータTO_DATE(壊れたデータに早く気づける)
  • ログやCSVなど、汚れたデータが混ざる可能性があるTRY_TO_DATE(NULLに逃がしてクレンジング)

たとえば外部から取り込んだCSVをETLする場合は、TRY_TO_DATE でいったんNULL化し、後から WHERE date_col IS NULL で不正レコードを抽出する流れが定番です。

よくあるハマりどころ

  • タイムスタンプ付き文字列(例: 2026-05-18 10:30:00)を TO_DATE に渡すと失敗します。TO_TIMESTAMP を使ってから ::DATE でキャストしましょう。
  • 2桁年(例: 26/05/18)は YY 指定にすればOKですが、世紀の解釈に注意してください。
  • カラム名の大文字小文字でハマったときは「Invalid identifier」エラーの記事も参考になります。

まとめ

「Date ‘…’ is not recognized」エラーは、フォーマット指定がないか、指定とデータが噛み合っていないのが原因のほぼ全てです。

  • デフォルトはISO形式(YYYY-MM-DD)のみ受け付ける
  • それ以外は TO_DATE(値, 'フォーマット') で明示する
  • 頻繁に使うフォーマットは DATE_INPUT_FORMAT で固定できる
  • 失敗を許容したいときは TRY_TO_DATE でNULL化する

これさえ押さえれば、日付エラーで何時間も悩むことはなくなるはずです。エラーメッセージは怖がらず、まず「フォーマットを教えてあげる」を試してみてくださいね!

参考リンク

関連記事

この記事をシェアする𝕏B!FacebookLINEPocket