SQL Server 2008でmmddyyyy
形式の文字列をdatetime
に変換するにはどうすればよいですか?
ターゲット列はDateTime
にあります
Convert
とほとんどのDate
スタイルの値を試しましたが、エラーメッセージが表示されます。
「varcharデータ型からdatetimeデータ型への変換の結果、範囲外の値が生じました。」
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)
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サーバーの機能に依存しています。
これは、文字列を操作することなく、変換に役立つことがわかりました。 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)は必要な形式でした。
変換できない不良データがある可能性があります。日付は、ASAPや02/30/2009などの日付を許可するため、varcharに保存しないでください。データに対してisdate()関数を使用して、変換できないレコードを見つけます。
OK既知の良好なデータでテストしても、メッセージが表示されました。 12302009がmmddyyyyかddmmyyyyかがわからないため、別の形式に変換する必要があります。 yyyymmddの形式はあいまいではなく、SQL Serverはそれを正しく変換します
私はこれを機能させました:
cast( right(@date,4) + left(@date,4) as datetime)
ただし、「112009」などの非標準形式やテキスト値、または範囲外の日付の形式がある場合は、エラーメッセージが表示されます。
変換は通常の答えですが、形式はコンバーターの認識された形式ではありません。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)
開始すべきBOLのCAST
/CONVERT
を見てください。
ターゲット列がdatetime
の場合、変換する必要はありません。SQLが自動的に行います。
さもないと
CONVERT(datetime, '20090101')
それを行う必要があります。
これは link であり、同様に役立つはずです。
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
のいずれかでなければなりませんyyyy-MM-dd
またはyyyy-MM-ddThh:mm:ss
ISO8601の詳細文化固有のフォーマットは遅かれ早かれトラブルにつながるでしょう...
私は似たようなもので運がありました:
Convert(DATETIME, CONVERT(VARCHAR(2), @Month) + '/' + CONVERT(VARCHAR(2), @Day)
+ '/' + CONVERT(VARCHAR(4), @Year))
try_Convertを使用:キャストが成功した場合、指定されたデータ型にキャストされた値を返します。それ以外の場合は、nullを返します。
DECLARE @DateString VARCHAR(10) ='20160805'
SELECT TRY_CONVERT(DATETIME,@DateString)
SET @DateString ='Invalid Date'
SELECT TRY_CONVERT(DATETIME,@DateString)
これが最も簡単な方法のようです。
SELECT REPLACE(CONVERT(CHAR(10), GETDATE(), 110),'-','')
スタイル(日付形式)を含めることができるため、CONVERTが最良の選択だと思います。そのため、USAのデフォルトはmm-dd-yyyyの110です。
挿入または更新中のSQL標準日付は、1/1753 AM 12:00:00 AMから12/31/9999 11:59:59 PMの間でなければなりません。
1/1/1753より下に挿入/更新している場合、このエラーが発生します。
この問題の根本的な原因は、地域の設定にある可能性があります-アプリが送信する間、DBはYYYY-MM-DDを待機します(たとえば、私の場合のようにDD-MM-YYYY(ロシア語ロケール形式))。私がやったこと-ロケール形式をロシア語から英語(米国)に変更し、ボイラー。