SQL-varcharデータ型を日時データ型に変換した結果、値が範囲外になりました


96

SQLを実行してデータ型の値をからvarcharに変換すると、次のエラーが発生しdatetimeます。

メッセージ242、レベル16、状態3、行1 varcharデータ型を日時データ型に変換すると、値が範囲外になりました。

データを確認しましたが、奇妙なことは何も表示されません。次のチェックを実行しましたが、すべて結果が返されませんでした。

SELECT [Date] from table where [DATe] is null
SELECT [Date] from table where [DATe] = ''
SELECT [Date] from table where LEN([date])> 10
SELECT [Date] from table where LEN([date])< 10
SELECT top 100 [Date] , SUBSTRING([date],4,2) from [table where convert(int, SUBSTRING([date],4,2)) < 1 or convert(int, SUBSTRING([date],4,2)) > 12
SELECT top 100 [Date] , SUBSTRING([date],1,2) from table where convert(int, SUBSTRING([date],4,2)) < 1 or convert(int, SUBSTRING([date],4,2)) > 31

他に一見の価値があり、この問題についての指針や助けになる価値のあるものはありますか?それの底をつかむことができないようです。


3
日付列のデータ型は何ですか?テーブルスキーマと、エラーが発生したというステートメントを教えてください。
Spikeh 2013

3
指定した6つのSQLステートメントのどれが失敗しますか?
Mureinik 2013

1
6つのステートメントはすべて機能し、データに問題がないことを確認します。
user23495 2013

3
2013-10-31や2013-02-30などの無効な日付を確認していません。おそらく、あなたが直面しているエラーは、そのような問題のある日付を指している
Dalen

2
こんにちはダレン、私はこのチェックをしました。データの設定方法は2013年10月31日、2013年10月30日です。英国フォーマットです。これは、列の型を変更しようとしたときに影響があるとは思いませんでした。
user23495 2013

回答:


90

私は一週間前に同じ問題に直面しました。問題はタイムゾーンの設定にあります。mm / dd / yyyyなどの他の形式で指定します(通常は機能します)。

日付を2013年12月30日として指定すると、エラーが発生しました。ただし、mm / dd / yyyy形式として指定しても機能しました。

入力を変換する必要がある場合は、CONVERTメソッドを調べてみることができます。構文は

CONVERT(VARCHAR,@your_date_Value,103)

CONVERT(VARCHAR, '12/30/2013', 103)

最後の103は日時形式です。

変換形式と詳細については、このリンクを参照してください。 https://www.w3schools.com/sql/func_sqlserver_convert.asp


1
ヘルプメイトをありがとう。私はこれを変換しようとしましたが、それでも運がありません。これは、tableがまだvarcharであるか、これを失敗させる可能性のある他の何かが原因である可能性がありますか?
user23495 2013

2
サンプルデータ(表にあります)を投稿すると非常に役立ちます。コメントで、yyyy-mm-dd形式で欲しいとおっしゃいました。だから、これを試してみてくださいSELECT CONVERT(char(10), GetDate(),126)GETDATE()を必要な値に置き換えるだけです。
Mahe

61

私はばかげた間違いのためにこの問題に遭遇しました。日付が実際に存在することを確認してください!

例えば:

2015年9月31日は存在しません。

EXEC dbo.SearchByDateRange @Start = '20150901' , @End = '20150931'

したがって、これは次のメッセージで失敗します。

Error converting data type varchar to datetime.

これを修正するには、有効な日付を入力します。

EXEC dbo.SearchByDateRange @Start = '20150901' , @End = '20150930'

そして、それはうまく実行されます。


2
ええ、私が使用しなければならないデータベースで、2015年2月29日の有効期限を見つけました。どうやってそこに入ったのかしら。私は...もっとそこにあるどのように多くの疑問
リソース

4
cast(SUBSTRING([MyDateField]、1,2)as integer)> 31を使用し、12月60日のレコードを見つけました。誰がこのようなものを入力しますか、ドクター・スース?
SteveCav 2015年

3
ありがとう!これが私の問題でした。セットにいくつかの悪いデータがありました-1113年1月1日、ハハ。
Sev09 2016

2
私の場合、SQLステートメントを作成するために日付をフォーマットするときに、間違ったフォーマット文字列を入力していました。あるFormat(DateTime.Now, "yyyymmdd")べきときに使っていたFormat(DateTime.Now, "yyyyMMdd")
Jay Imerman 2017年

1
ああアメリカの日付の慣習!「2017年10月26日」、つまり「2017年10月26日」は完全に有効な日付なので、しばらく困惑していました:)
アンチモン

31

最近同様の問題が発生しました。地域設定は、アプリとデータベースサーバーの両方で適切に設定されました。ただし、SQLを実行すると

「varcharデータ型を日時データ型に変換すると、値が範囲外になりました」。

問題は、dbユーザーのデフォルト言語でした。

SSMSで確認または変更するには、[セキュリティ]-> [ログイン]に移動し、クエリを実行するユーザーのユーザー名を右クリックします。プロパティ->一般を選択し、ダイアログの下部にあるデフォルトの言語が期待どおりであることを確認します。

クエリを実行するすべてのユーザーに対してこれを繰り返します。


2
これは私を助けました。ほんの少しの修正:server loginnotのデフォルト言語db usertop-password.com/blog/...
バズGuvenkaya

1
それは、プログラムコードに設定されたと私はコードへのアクセスを持っていなかったので、私はからそれを変更EnglishするBritish Englishと、それが働いています!
vaheeds

1
英語をイギリス英語に変更するのも同じです-アリ、あなたは命の恩人です!
デヴィッド・ジョルジ


4
Create procedure [dbo].[a]

@examdate varchar(10) ,
@examdate1 varchar(10)
AS
Select tbl.sno,mark,subject1,
Convert(varchar(10),examdate,103) from tbl
where 
(Convert(datetime,examdate,103)  >= Convert(datetime,@examdate,103) 
and (Convert(datetime,examdate,103) <=  Convert(datetime,@examdate1,103)))

5
回答に説明を追加してください。それは質問者があなたの答えからより多くを把握するのに役立ちます。
Pramod S. Nikam 2014年

2

私は同じ問題を抱えており、SQL Serverが同じ方法で整数に変換された文字の比較を実行しないため、この問題が発生すると判断しました。私のテストでは、感嘆符などの変換された文字の一部の比較では型変換エラーが返され、スペースなどの変換された文字の他の比較では範囲外であると判断されることがわかりました。

このサンプルコードは、考えられるさまざまなシナリオをテストし、ネストされたREPLACEステートメントを使用して解決策を示します。REPLACEは、文字列に数字またはスラッシュ以外の文字があるかどうかを判別します。存在する場合は、文字列の長さがゼロより大きくなるため、「不良」文字があり、日付が無効であることを示します。 。

DECLARE @str varchar(10)
SET @str = '12/10/2012'
IF convert(int, substring(@str,4,2)) <= 31 AND convert(int, substring(@str,4,2)) >= 1
    PRINT @str+': Passed Test'
    ELSE PRINT @str+': Failed Test'
GO

DECLARE @str varchar(10)
SET @str = '12/10/2012' 
PRINT 'Number of characters in ' + @str + ' that are not numerals or a slash (0 means the date is valid; all values greater than 0 indicate a problem): ' + convert(varchar(5),len(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(@str,'0',''),'1',''),'2',''),'3',''),'4',''),'5',''),'6',''),'7',''), '8',''),'9',''),'/',''),' ','+'))) --replace space with a + to avoid empty string
PRINT ''
GO

DECLARE @str varchar(10)
SET @str = '12/!0/2012'
    IF convert(int, substring(@str,4,2)) <= 31 AND convert(int, substring(@str,4,2)) >= 1
        PRINT @str+': Passed Test'
        ELSE PRINT @str+': Failed Test'
GO

DECLARE @str varchar(10)
SET @str = '12/!0/2012' 
PRINT 'Number of characters in ' + @str + ' that are not numerals or a slash (0 means the date is valid; all values greater than 0 indicate a problem): ' + convert(varchar(5),len(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(@str,'0',''),'1',''),'2',''),'3',''),'4',''),'5',''),'6',''),'7',''), '8',''),'9',''),'/',''),' ','+'))) --replace space with a + to avoid empty string
PRINT ''
GO

DECLARE @str varchar(10)
SET @str = '12/  /2012'
IF convert(int, substring(@str,4,2)) <= 31 AND convert(int, substring(@str,4,2)) >= 1
    PRINT @str+': Passed Test'
    ELSE PRINT @str+': Failed Test'
GO

DECLARE @str varchar(10)
SET @str = '12/  /2012' 
PRINT 'Number of characters in ' + @str + ' that are not numerals or a slash (0 means the date is valid; all values greater than 0 indicate a problem): ' + convert(varchar(5),len(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(@str,'0',''),'1',''),'2',''),'3',''),'4',''),'5',''),'6',''),'7',''), '8',''),'9',''),'/',''),' ','+'))) --replace space with a + to avoid empty string

出力:

--Output
--12/10/2012: Passed Test
--Number of characters in 12/10/2012 that are not numerals or a slash (0 means the date is valid; all values greater than 0 indicate a problem): 0

--Msg 245, Level 16, State 1, Line 4
--Conversion failed when converting the varchar value '!0' to data type int.
--Number of characters in 12/!0/2012 that are not numerals or a slash (0 means the date is valid; all values greater than 0 indicate a problem): 1

--12/  /2012: Failed Test
--Number of characters in 12/  /2012 that are not numerals or a slash (0 means the date is valid; all values greater than 0 indicate a problem): 2

2
+ this happens because sql sometimes doesn't recognize dd/mm/yyyy format
+ so we should always check if the input string is a valid date or not and the accordingly convert it to mm/dd/yyyy and so , i have shown below how it can be done, i have created a function to rearrange in mm/dd/yyyy from dd/mm/yyyy

select case when isdate('yourdate')=1 then CAST('yourdate' AS datetime) 
  else (select * from dbo.fn_convertdate(yourdate))

Create function dbo.fn_convertdate( @Stringdate nvarchar(29))
RETURNS @output TABLE(splitdata NVARCHAR(MAX) 
)
Begin
Declare @table table(id int identity(1,1), data varchar(255))
Declare @firstpart nvarchar(255)
Declare @tableout table(id int identity(1,1), data varchar(255))

Declare @Secondpart nvarchar(255)
Declare @Thirdpart nvarchar(255)

declare @date datetime

insert into @table
select * from dbo.fnSplitString(@Stringdate,'/')
select @firstpart=data from @table where id=2
select @Secondpart=data from @table where id=1
select @Thirdpart=data from @table where id=3
set @date=@firstpart+'/'+@Secondpart+'/'+@Thirdpart
insert into @output(splitdata) values(
@date)


return
End

日付文字列「19610010」(形式:YYYYMMDD)の問題のある行があり、「nvarcharデータ型を日時データ型に変換すると範囲外の値」エラーが発生しました。SELECT CONVERT(datetime、 'yourdate')FROM [yourtable] WHERE ISDATE( 'yourdate')= 1保存日:)
J Pollack

2

sysdateを列に自動挿入しているときに、私もこの問題に遭遇しました。

私がしたことは、SQLサーバーの日付形式と一致するようにシステムの日付形式を変更したことです。たとえば、SQL形式はmm / dd / yyyyで、システム形式はdd / mm / yyyyに設定されていました。システム形式をmm / dd / yyyyに変更し、エラーがなくなりました

-kb


2

ご存知のように、これは英国フォーマットの問題です。関数を使用して間接的に日付変換を行うことができます。

CREATE FUNCTION  ChangeDateFormatFromUK
( 
   @DateColumn varchar(10)
)

RETURNS VARCHAR(10)
AS 
 BEGIN
    DECLARE @Year varchar(4), @Month varchar(2), @Day varchar(2), @Result varchar(10)
    SET @Year = (SELECT substring(@DateColumn,7,10))
    SET @Month = (SELECT substring(@DateColumn,4,5)) 
    SET @Day = (SELECT substring(@DateColumn,1,2))
   SET @Result  = @Year  + '/' @Month + '/' +  @Day

 RETURN @Result
END

この関数を呼び出すには

SELECT dbo.ChangeDateFormatFromUK([dates]) from table

通常どおり日時に変換します

SELECT CONVERT(DATETIME,dbo.ChangeDateFormatFromUK([dates])) from table

あなたの場合、あなたはすることができます

SELECT [dates] from table where CONVERT(DATETIME,dbo.ChangeDateFormatFromUK([dates])) > GetDate()   -- or any date

2

2079年を超える年のテスト。ユーザーが2016年(10/12/2106)ではなく2106を入力し、ブームになっていることがわかりました。そのため、2016年10月12日にテストしたところ、SQL Serverは2078年まで受け入れられ、年が2079年以上の場合にそのエラーをスローし始めました。SQL Serverのスライディングがどのような日付であるかについては、これ以上の調査は行っていません。


1

新しいテーブル(DateTimeがファイルされている)に変換したいvarcharフィールドを最初にDateTime互換のレイアウトに変換しただけで、SQLはvarcharからDateTimeへの変換を問題なく実行します。

以下では(これらの名前で作成したテーブルではありません!)、必要に応じて、varcharフィールドをDateTimeに似たものにするだけです。

update report1455062507424 
set [Move Time] = substring([Move Time], 7, 4) + '-'+ substring([Move Time], 4, 2) + '-'+ substring([Move Time], 1, 2) + ' ' + 
    substring([Move Time], 12, 5)  

1
Varchar Date Convert to Date and Change the Format

2016年11月12日12:00、2016年12月21日、2016年12月21日このクエリは上記で機能し、この形式dd / MM / yyyyに変更されます SELECT [Member_ID],[Name] , Convert(varchar(50),Convert(date,[DOB],103),103) as DOB ,[NICNO],[Relation] FROM [dbo].[tbl_FamilMember]


0

このエラーは、C#コードから直接インラインクエリを使用して列に最小の日付と時刻を格納しようとしたために発生しました。

C#のDateTimeは、他の方法で設定されていない場合、この日付と時刻で初期化されるため、コードでは日付変数が01/01/0001 12:00:00 AMに設定されました。また、MS-SQL2008のdatetimeデータ型で許可される最小の日付は1753-01-0112:00:00AMです。

コードから日付を変更して1900年1月1日に設定しましたが、それ以上エラーは報告されませんでした。


0

MMの代わりにmmを使用した日付でToString()を使用しました。


0

日付に互換性があること、またはデータベースマネージャー(SQL Server Management Studioなど)で正しく実行できることを確認してください。たとえば、DateTime.Now C#関数はSQL Serverでは無効です。つまり、クエリにはSQL ServerのGETDATE()などの有効な関数を含める必要があります。

この変更は私にとって完璧に機能しました。


0

この問題の少し珍しい原因ですが、誰かがそれを必要とする場合に備えて。私が取り組んでいたコードは次のものを使用していました:

java.text.DateFormat.getDateTimeInstance()

日付フォーマッタを取得します。このバグレポートに記載されたJava 9までのJava 8から変化し、この呼び出しによって返された書式設定パターン:https://bugs.openjdk.java.net/browse/JDK-8152154は、どうやらそれは私のために戻った書式設定することは適していませんでしたデータベース用。代わりに、これに対する解決策がありました。

DateTimeFormatter.ISO_LOCAL_DATE_TIME
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.