17

私はこのようにたくさんの日付を持っています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
文字列から日付や時刻を変換するときに変換に失敗しました。

4

5 に答える 5

20

あなた(またはこのテーブルを設計した人)が原因でエラーが発生しています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;

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

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

...しかし、これはクライアントで行う方が良いです (もしあれば)。

ガベージ イン、ガベージ アウトという一般的な用語があります。データ型の選択(またはテーブルを設計した人のデータ型の選択)が本質的にテーブルへのガベージを許可する場合、日付に変換することはできません(特定の形式の文字列に変換することは気にしないでください)。修正してください。または、テーブルを設計した人に (これもまた、実に見事に) 修正を依頼してください。

于 2013-03-10T00:08:08.327 に答える
15

使用するSELECT CONVERT(date, '20140327')

あなたの場合、

SELECT [FIRST_NAME],
       [MIDDLE_NAME],
       [LAST_NAME],
       CONVERT(date, [GRADUATION_DATE])     
FROM mydb
于 2014-03-27T10:11:01.877 に答える