1. ホーム
  2. sql

[解決済み] YYYYMMDDをDATEに変換する

2022-03-08 17:02:13

質問

の中に日付の束があります。 varchar このように

20080107
20090101
20100405
...

このように日付形式に変換するにはどうすればよいのでしょうか。

2008-01-07
2009-01-01
2010-04-05

これを使ってみました。

SELECT [FIRST_NAME]
      ,[MIDDLE_NAME]
      ,[LAST_NAME]      
      ,cast([GRADUATION_DATE] as date)      
  FROM mydb

しかし、このようなメッセージが表示されます。

Msg 241, レベル16, ステート1, ライン2
文字列から日付や時刻を変換する際に、変換に失敗しました。

解決方法は?

エラーが発生する原因は、あなた(またはこのテーブルを設計した人)です。 have a bunch of dates in VARCHAR . なぜ、あなた(またはこのテーブルを設計した人)は日付を文字列として保存しているのですか?あなた(またはこのテーブルを設計した人)は、給与や価格や距離も文字列として保存していますか?

問題を引き起こしている値を見つけるため(あなた(またはこのテーブルを設計した人)がそれを修正できるように)。

SELECT GRADUATION_DATE FROM mydb
  WHERE ISDATE(GRADUATION_DATE) = 0;

少なくとも1行はあるはずです。それらの値を修正し、テーブルを修正します。あるいは、テーブルをデザインした人に頼んで、テーブルを修正してもらいましょう。本当にうまく。

ALTER TABLE mydb ALTER COLUMN GRADUATION_DATE DATE;

これで、書式について心配する必要はありません。 YYYYMMDD または YYYY-MM-DD を使うか、クライアント上で CONVERT をSQLで実行します。があるときは 有効な の日付を文字列リテラルとして使用することができます。

SELECT CONVERT(CHAR(10), CONVERT(datetime, '20120101'), 120);

...しかし、これは(もし可能であれば)クライアントで行うのがよいでしょう。

ガベージ・イン、ガベージ・アウトという言葉があります。日付に変換することは絶対にできません。 文字列 もし、あなたのデータ型の選択(またはテーブルを設計した人のデータ型の選択)が、本質的にゴミをテーブルに入れるものであるなら、特定のフォーマットで)。それを修正してください。あるいは、テーブルを設計した人に(もう一度、本当にうまく)修正するように頼んでください。