web-dev-qa-db-ja.com

SQL Serverでvarcharをdatetimeに変換します

SQL Server 2008でmmddyyyy形式の文字列をdatetimeに変換するにはどうすればよいですか?

ターゲット列はDateTimeにあります

ConvertとほとんどのDateスタイルの値を試しましたが、エラーメッセージが表示されます。

「varcharデータ型からdatetimeデータ型への変換の結果、範囲外の値が生じました。」

61
Developer

OPはmmddyyを必要としているため、プレーンコンバージョンは機能しません。

select convert(datetime,'12312009')

Msg 242, Level 16, State 3, Line 1 
The conversion of a char data type to a datetime data type resulted in 
an out-of-range datetime value

これを試してください:

DECLARE @Date char(8)
set @Date='12312009'
SELECT CONVERT(datetime,RIGHT(@Date,4)+LEFT(@Date,2)+SUBSTRING(@Date,3,2))

出力:

-----------------------
2009-12-31 00:00:00.000

(1 row(s) affected)
72
KM.

SQL Serverは、 'YYYYMMDD'の形式の文字列を暗黙的にdatetimeにキャストできます。他のすべての文字列は明示的にキャストする必要があります。ここに、あなたが話しているフォームからの変換を行う2つのクイックコードブロックがあります。

バージョン1はユニット変数を使用します:

BEGIN 
DECLARE @input VARCHAR(8), @mon CHAR(2), 
@day char(2), @year char(4), @output DATETIME

SET @input = '10022009'   --today's date


SELECT @mon = LEFT(@input, 2), @day = SUBSTRING(@input, 3,2), @year = RIGHT(@input,4)

SELECT @output = @year+@mon+@day 
SELECT @output 
END

バージョン2はユニット変数を使用しません:

BEGIN 
DECLARE @input CHAR(8), @output DATETIME
SET @input = '10022009' --today's date 

SELECT @output = RIGHT(@input,4) + SUBSTRING(@input, 3,2) + LEFT(@input, 2)

SELECT @output
END

どちらの場合も、その暗黙的な変換を行うSQLサーバーの機能に依存しています。

7
nick

これは、文字列を操作することなく、変換に役立つことがわかりました。 https://docs.Microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql

CONVERT(VARCHAR(23), @lastUploadEndDate, 121)

yyyy-mm-dd hh:mi:ss.mmm(24h)は必要な形式でした。

5
Stephen Himes

変換できない不良データがある可能性があります。日付は、ASAPや02/30/2009などの日付を許可するため、varcharに保存しないでください。データに対してisdate()関数を使用して、変換できないレコードを見つけます。

OK既知の良好なデータでテストしても、メッセージが表示されました。 12302009がmmddyyyyかddmmyyyyかがわからないため、別の形式に変換する必要があります。 yyyymmddの形式はあいまいではなく、SQL Serverはそれを正しく変換します

私はこれを機能させました:

cast( right(@date,4) + left(@date,4) as datetime)

ただし、「112009」などの非標準形式やテキスト値、または範囲外の日付の形式がある場合は、エラーメッセージが表示されます。

4
HLGEM

変換は通常の答えですが、形式はコンバーターの認識された形式ではありません。mm/ dd/yyyyはconvert(datetime、yourdatestring、101)を使用して変換できますが、その形式がないため失敗します。

問題はフォーマットが非標準であるため、変換者が利用可能なものから理解できる標準にそれを操作する必要があります。

あなたがフォーマットを保証できるなら、一緒にハッキングされます

declare @date char(8)
set @date = '12312009'
select convert(datetime, substring(@date,5,4) + substring(@date,1,2) + substring(@date,3,2),112)
4
Andrew

開始すべきBOLのCAST/CONVERTを見てください。

ターゲット列がdatetimeの場合、変換する必要はありません。SQLが自動的に行います。

さもないと

CONVERT(datetime, '20090101')

それを行う必要があります。

これは link であり、同様に役立つはずです。

3
JonH

STUFFを使用して分割文字を挿入し、適切なスタイルでCONVERTを使用します。このようなもの:

DECLARE @dt VARCHAR(100)='111290';
SELECT CONVERT(DATETIME,STUFF(STUFF(@dt,3,0,'/'),6,0,'/'),3)

最初に、111290の代わりに2回、STUFFを使用して11/12/90を取得します。3を使用してこれをdatetime(またはその他のフィッティング)に変換します形式:ドイツ語の場合は.を、英国語の場合は-を使用します...) CAST and CONVERTの詳細

日付と時刻の値を適切に保存するのが最善でした。

  • これは、「ユニバーサル非分離フォーマット」yyyyMMddのいずれかでなければなりません
  • または(特にXML内では)ISO8601である必要があります:yyyy-MM-ddまたはyyyy-MM-ddThh:mm:ssISO8601の詳細

文化固有のフォーマットは遅かれ早かれトラブルにつながるでしょう...

1
Shnugo

私は似たようなもので運がありました:

Convert(DATETIME, CONVERT(VARCHAR(2), @Month) + '/' + CONVERT(VARCHAR(2), @Day)
+ '/' + CONVERT(VARCHAR(4), @Year))
1
Ryan

try_Convertを使用:キャストが成功した場合、指定されたデータ型にキャストされた値を返します。それ以外の場合は、nullを返します。

DECLARE @DateString VARCHAR(10) ='20160805'
SELECT TRY_CONVERT(DATETIME,@DateString)

SET @DateString ='Invalid Date'
SELECT TRY_CONVERT(DATETIME,@DateString)

リンク: MSDN TRY_CONVERT(Transact-SQL)

1
Shahab J

これが最も簡単な方法のようです。

SELECT REPLACE(CONVERT(CHAR(10), GETDATE(), 110),'-','')
0
Daniel Folz

スタイル(日付形式)を含めることができるため、CONVERTが最良の選択だと思います。そのため、USAのデフォルトはmm-dd-yyyyの110です。

0
Kevin Horgan

挿入または更新中のSQL標準日付は、1/1753 AM 12:00:00 AMから12/31/9999 11:59:59 PMの間でなければなりません。

1/1/1753より下に挿入/更新している場合、このエラーが発生します。

0

この問題の根本的な原因は、地域の設定にある可能性があります-アプリが送信する間、DBはYYYY-MM-DDを待機します(たとえば、私の場合のようにDD-MM-YYYY(ロシア語ロケール形式))。私がやったこと-ロケール形式をロシア語から英語(米国)に変更し、ボイラー。

0
Denis Maslov