web-dev-qa-db-ja.com

YYYYMMDDからDATEへの変換

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

ただし、次のメッセージを取得してください。

メッセージ241、レベル16、状態1、行2
日付および/または時刻を文字列から変換するときに変換に失敗しました。

12
screechOwl

あなた(またはこのテーブルを設計した人)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として書式設定できます。または、SQLでCONVERTを使用できます。文字列リテラルとして有効日付がある場合、次を使用できます。

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

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

一般的な用語があります-ガベージイン、ガベージアウト。データ型の選択(またはテーブルを設計した人のデータ型の選択)が本質的に含まれている場合、日付に変換することは決してできません(特定の形式でstringに変換することはありません)テーブルにゴミを入れます。修正してください。または、テーブルを設計した人に(もう一度、本当にすてきに)修正してもらいます。

19
Aaron Bertrand

SELECT CONVERT(date, '20140327')を使用します

あなたの場合、

SELECT [FIRST_NAME],
       [MIDDLE_NAME],
       [LAST_NAME],
       CONVERT(date, [GRADUATION_DATE])     
FROM mydb
11
user1400641

あなたの場合、次のようになります。

Select convert(datetime,convert(varchar(10),GRADUATION_DATE,120)) as
'GRADUATION_DATE' from mydb
1
user3590035