web-dev-qa-db-ja.com

SQL - varcharデータ型からdatetimeデータ型への変換の結果、範囲外の値が返されました

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

メッセージ242、レベル16、状態3、行1 varcharデータ型からdatetimeデータ型への変換の結果、範囲外の値になりました。

私はデータをチェックしましたが、奇妙なことは何も見えません。以下のチェックを実行しても結果がまったく返されない

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

この問題に関して、他にも検討する価値がある、または何らかの価値があるポインタまたは支援が必要ですか。それを理解できないようです。

63
user23495

私は一週間前に同じ問題に直面しました。問題はタイムゾーンの設定にあります。 mm/dd/yyyyのような他の形式で指定してください(通常は動作します)。

日付を30/12/2013と指定すると、エラーが発生しました。ただし、mm/dd/yyyy形式として指定するとうまくいきました。

入力を変換する必要がある場合は、CONVERTメソッドを調べてみてください。構文は

CONVERT(VARCHAR,@your_date_Value,103)

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

終わり103は日時形式です。

変換フォーマットおよび詳細については、このリンクを参照してください。 http://www.w3schools.com/sql/func_convert.asp

60
Mahe

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

例えば:

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

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

だからこれはメッセージで失敗します:

Error converting data type varchar to datetime.

修正するには、有効な日付を入力してください。

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

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

47
Mr. C

私は最近同様の問題を抱えていました。地域設定は、アプリとデータベースサーバーの両方で正しく設定されていました。ただし、SQLを実行した結果

msgstr "varcharデータ型をdatetimeデータ型に変換すると範囲外の値になりました"#:。

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

SSMSでそれを確認または変更するには、「セキュリティー」 - >「ログイン」に進み、照会を実行するユーザーのユーザー名を右クリックします。 [プロパティ] - > [一般]を選択し、ダイアログ下部のデフォルトの言語が正しいことを確認します。

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

16
ali

あなたは利用することができます

Set dateformat <date-format> ;

物事を成し遂げるためにあなたの中にsp関数またはストアドプロシージャ。

8
Sachin Mishra
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)))
3
sonu yadav

列へのsysdateの自動挿入中に私もこの問題に遭遇しました。

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

-kb

2
user5714464

私は同じ問題を抱えていて、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
RSax

2079年以上のテスト。ユーザーがその年(2016年10月12日)に2016年の代わりに2106をタイプミスしてブームになったことがわかりました。だから私はテストし、2016年12月12日にSQL Serverが2078年まで受け入れて、年が2079年以上であればそのエラーを投げ始めたのを見つけました。 SQL Serverがどのような日付スライディングを行うのかについては、これ以上調査していません。

2
gordon

ご存じのとおり、これはイギリスのフォーマットの問題です。関数を使って間接的に日付変換をすることができます。

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
Sumit
+ 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
1
shashank m
Varchar Date Convert to Date and Change the Format

Nov 12 2016 12:00、21/12/2016、21-12-2016このクエリは、上記の形式でこのフォーマットに変更するために機能しますdd/MM/yyyy SELECT [Member_ID],[Name] , Convert(varchar(50),Convert(date,[DOB],103),103) as DOB ,[NICNO],[Relation] FROM [dbo].[tbl_FamilMember]

1
Khalid

最初に変換したいvarcharフィールドを(DateTimeフィールドで)新しい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
Andre

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

C#のDateTimeが他の方法で設定されていない場合、C#のDateTimeがこの日付と時刻で初期化されるという事実を考慮すると、date変数は01/01/0001 12:00:00 AMに設定されています。また、MS-SQL 2008のdatetimeデータ型で許容される最小日付は1753-01-01 12:00:00 AMです。

私はコードから日付を変更して01/01/1900に設定し、それ以上のエラーは報告されていません。

0
Talha Imam

MMではなくmmを使用してToString()を使用しました。

0
L0uis

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

この変更は私には完璧に働きました。

0
tonderaimuchada