SQL - Die Konvertierung eines varchar-Datentyps in einen datetime-Datentyp führte zu einem Wert außerhalb des Bereichs

87

Beim Ausführen einer SQL zum Konvertieren meines Datentypwerts von varcharnach hat die folgende Fehlermeldung angezeigt datetime.

Meldung 242, Ebene 16, Status 3, Zeile 1 Die Konvertierung eines Varchar-Datentyps in einen Datetime-Datentyp führte zu einem Wert außerhalb des Bereichs.

Ich habe die Daten überprüft und sehe nichts Ungewöhnliches: Ich habe die folgenden Überprüfungen durchgeführt und alle haben keine Ergebnisse zurückgegeben

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

Gibt es noch etwas, das es wert ist, angeschaut zu werden und vielleicht Hinweise oder Hilfe bei diesem Problem wert zu sein? Ich kann nicht scheinen, den Grund dafür zu finden.

user23495
quelle
3
Was ist der Datentyp der Datumsspalte? Könnten Sie mir bitte das Tabellenschema und die Aussage zeigen, dass der Fehler auftritt?
Spikeh
3
Welche der sechs von Ihnen angegebenen SQL-Anweisungen schlägt fehl?
Mureinik
1
Die sechs Anweisungen funktionieren alle und verifizieren keine Probleme mit Daten.
user23495
3
Sie haben nicht nach ungültigen Daten gesucht, z. B. 2013-10-31 oder 2013-02-30. Wahrscheinlich bezieht sich der Fehler, mit dem Sie konfrontiert sind, auf diese Art von problematischen Daten
Dalen
2
Hallo Dalen, ich habe diese Prüfung durchgeführt. Die Art und Weise, wie Daten eingerichtet werden, ist der 31.10.2013, der 30.10.2013. Es ist im britischen Format. Wird dies Auswirkungen haben, wenn versucht wird, einen Spaltentyp zu ändern, hätte ich nicht gedacht, dass dies der Fall sein würde.
user23495

Antworten:

84

Ich habe vor einer Woche das gleiche Problem gehabt. Das Problem liegt in der Zeitzoneneinstellung. Geben Sie in anderen Formaten wie MM / TT / JJJJ an (funktioniert normalerweise).

Die Angabe des Datums als 30/12/2013 führte zu dem Fehler für mich. Die Angabe als MM / TT / JJJJ-Format hat jedoch funktioniert.

Wenn Sie Ihre Eingabe konvertieren müssen, können Sie versuchen, die CONVERTMethode zu untersuchen. Syntax ist

CONVERT(VARCHAR,@your_date_Value,103)

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

Das Finishing 103 ist das Datums- / Uhrzeitformat.

Unter diesem Link finden Sie Konvertierungsformate und weitere Informationen. https://www.w3schools.com/sql/func_sqlserver_convert.asp

Mahe
quelle
1
Danke für die Hilfe Kumpel. Ich habe versucht, dies umzuwandeln, hatte aber immer noch kein Glück. Könnte es daran liegen, dass die Tabelle noch ein Varchar ist oder irgendetwas anderes, das dazu führen kann, dass dies fehlschlägt?
user23495
2
Es wäre sehr hilfreich, wenn Sie Ihre Beispieldaten (die in der Tabelle aufgeführt sind) veröffentlichen. In einem Kommentar sagten Sie, Sie möchten es im Format JJJJ-MM-TT. Versuchen Sie es also SELECT CONVERT(char(10), GetDate(),126). Ersetzen Sie einfach GETDATE () durch den erforderlichen Wert.
Mahe
60

Ich bin auf dieses Problem aufgrund eines dummen Fehlers gestoßen. Stellen Sie sicher, dass das Datum tatsächlich existiert!

Zum Beispiel:

Der 31. September 2015 existiert nicht.

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

Das schlägt also mit der Meldung fehl:

Error converting data type varchar to datetime.

Geben Sie ein gültiges Datum ein, um das Problem zu beheben:

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

Und es funktioniert gut.

Herr C.
quelle
2
Ja, ich habe gerade ein Ablaufdatum vom 29. Februar 2015 in der Datenbank gefunden, mit der ich arbeiten muss. Ich frage mich, wie es da reingekommen ist. Ich frage mich, wie viele noch da
Ressource
4
Ich habe gerade cast (SUBSTRING ([MyDateField], 1,2) als Ganzzahl)> 31 verwendet und mit dem 60. Dezember einen Rekord gefunden. Wer betritt dieses Zeug, Dr. Suess?
SteveCav
3
Vielen Dank! Das war mein Problem. Ich hatte einige schlechte Daten in meinem Set - 01.01.1113, haha.
Sev09
2
Für mich hatte ich beim Formatieren des Datums zum Erstellen der SQL-Anweisung die falsche Formatzeichenfolge eingegeben. Ich hatte verwendet, Format(DateTime.Now, "yyyymmdd")wann es hätte sein sollenFormat(DateTime.Now, "yyyyMMdd")
Jay Imerman
1
Argh amerikanische Datumskonventionen! Hatte mich für eine Weile verblüfft, seit "26. Oktober 2017" dh '26 -10-2017 'ist ein vollkommen gültiges Datum :)
Antimon
29

Ich hatte kürzlich ein ähnliches Problem. Die regionalen Einstellungen wurden sowohl in der App als auch im Datenbankserver ordnungsgemäß eingerichtet. Die Ausführung von SQL führte jedoch zu

"Die Konvertierung eines varchar-Datentyps in einen datetime-Datentyp führte zu einem Wert außerhalb des Bereichs."

Das Problem war die Standardsprache des Datenbankbenutzers.

Um dies in SSMS zu überprüfen oder zu ändern, gehen Sie zu Sicherheit -> Anmeldungen und klicken Sie mit der rechten Maustaste auf den Benutzernamen des Benutzers, der die Abfragen ausführt. Wählen Sie Eigenschaften -> Allgemein und stellen Sie sicher, dass die Standardsprache am unteren Rand des Dialogfelds Ihren Erwartungen entspricht.

Wiederholen Sie diesen Vorgang für alle Benutzer, die Abfragen ausführen.

ali
quelle
1
Das hat mir geholfen. Nur eine kleine Korrektur: Standardsprache des server loginNicht db user. top-password.com/blog/…
Baz Guvenkaya
1
Da es im Programmcode festgelegt war und ich keinen Zugriff auf den Code hatte, habe ich ihn von Englishauf geändert British Englishund es hat funktioniert!
Vaheeds
1
Das gleiche gilt für mich, um Englisch in britisches Englisch zu ändern - Ali, du bist ein Lebensretter!
David-Giorgi
10

Sie können nutzen

Set dateformat <date-format> ;

in Ihrer SP-Funktion oder gespeicherten Prozedur, um Dinge zu erledigen.

Sachin Mishra
quelle
1
Dies löste mein Problem. Was ich nicht verstehe ist, warum dies plötzlich passiert :(
VictorEspina
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)))
Sonu Yadav
quelle
5
Bitte fügen Sie Ihrer Antwort eine weitere Beschreibung hinzu. Es wird dem Fragesteller helfen, mehr aus Ihrer Antwort herauszuholen.
Pramod S. Nikam
2

Ich hatte das gleiche Problem und stellte fest, dass dieses Problem auftritt, weil SQL Server keine Vergleiche mit Zeichen durchführt, die auf identische Weise in Ganzzahlen konvertiert wurden. In meinem Test habe ich festgestellt, dass einige Vergleiche von konvertierten Zeichen, wie z. B. das Ausrufezeichen, Typkonvertierungsfehler zurückgeben, während andere Vergleiche von konvertierten Zeichen, wie z. B. das Leerzeichen, außerhalb des Bereichs liegen.

Dieser Beispielcode testet die verschiedenen möglichen Szenarien und präsentiert eine Lösung mit verschachtelten REPLACE-Anweisungen. Der REPLACE bestimmt, ob die Zeichenfolge Zeichen enthält, die keine Ziffern oder Schrägstriche sind, und falls vorhanden, ist die Länge der Zeichenfolge größer als Null, wodurch angezeigt wird, dass "schlechte" Zeichen vorhanden sind und das Datum ungültig ist .

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

Ausgabe:

--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
RSax
quelle
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
shashank m
quelle
Hatte eine problematische Zeile mit der Datumszeichenfolge '19610010' (Format: JJJJMMTT), die den Fehler 'Die Konvertierung eines nvarchar-Datentyps in einen datetime-Datentyp führte zu einem Wert außerhalb des Bereichs' verursachte. SELECT CONVERT (datetime, 'yourdate') FROM [yourtable] WHERE ISDATE ('yourdate') = 1 hat den Tag gespeichert :)
J Pollack
2

Auch dieses Problem ist beim automatischen Einfügen eines Sysdatums in eine Spalte aufgetreten.

Ich habe mein System-Datumsformat so geändert, dass es mit dem Datumsformat des SQL Servers übereinstimmt. Beispiel: Mein SQL-Format war MM / TT / JJJJ und mein Systemformat war TT / MM / JJJJ. Ich habe mein Systemformat in MM / TT / JJJJ geändert und der Fehler ist verschwunden

-kb

user5714464
quelle
2

Wie Sie wissen, handelt es sich um ein Problem im britischen Format. Sie können die Datumskonvertierung indirekt mithilfe der Funktion durchführen.

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

Diese Funktion aufrufen

SELECT dbo.ChangeDateFormatFromUK([dates]) from table

Konvertieren Sie es normal in datetime

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

In Ihrem Fall können Sie tun

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

Test für Jahr> 2079. Ich fand heraus, dass ein Benutzer im Jahr (10/12/2106) 2106 anstelle von 2016 tippte und boomte; Daher habe ich am 12.10.2016 getestet und festgestellt, dass SQL Server bis 2078 akzeptiert wurde. Dieser Fehler wurde ausgelöst, wenn das Jahr 2079 oder höher ist. Ich habe keine weiteren Nachforschungen angestellt, welche Art von Datumsverschiebung SQL Server bewirkt.

Gordon
quelle
1

Ich habe einfach das varchar-Feld, das ich in eine neue Tabelle (mit einer DateTime-Datei) konvertieren wollte, zuerst in ein DateTime-kompatibles Layout konvertiert, und dann führt SQL die Konvertierung von varchar in DateTime ohne Probleme durch.

Im Folgenden (nicht meine erstellte Tabelle mit diesen Namen!) Mache ich das varchar-Feld einfach zu einem DateTime-Lookalike, wenn Sie möchten:

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)  
Andre
quelle
1
Varchar Date Convert to Date and Change the Format

12.11.2016 12:00, 21/12/2016, 21-12-2016 Diese Abfrage funktioniert für oben, um in dieses Format TT / MM / JJJJ zu wechseln SELECT [Member_ID],[Name] , Convert(varchar(50),Convert(date,[DOB],103),103) as DOB ,[NICNO],[Relation] FROM [dbo].[tbl_FamilMember]

Khalid
quelle
0

Dieser Fehler trat bei mir auf, weil ich versucht habe, das Mindestdatum und die Mindestzeit in einer Spalte mithilfe von Inline-Abfragen direkt aus dem C # -Code zu speichern.

Die Datumsvariable wurde im Code auf 01/01/0001 00:00:00 AM gesetzt, da DateTime in C # mit diesem Datum und dieser Uhrzeit initialisiert wird, wenn sie nicht anderweitig festgelegt wurden. Das im Datentyp datetime von MS-SQL 2008 zulässige Mindestdatum ist 1753-01-01 00:00:00 AM.

Ich habe das Datum aus dem Code geändert und auf 01/01/1900 gesetzt, und es wurden keine weiteren Fehler gemeldet.

Talha Imam
quelle
0

Ich habe ToString () an einem Datum mit mm anstelle von MM verwendet.

L0uis
quelle
0

Stellen Sie einfach sicher, dass Ihre Daten kompatibel sind oder in Ihrem Datenbankmanager (z. B. SQL Server Management Studio) ordnungsgemäß ausgeführt werden können. Beispielsweise ist die DateTime.Now C # -Funktion in SQL Server ungültig, was bedeutet, dass Ihre Abfrage gültige Funktionen wie GETDATE () für SQL Server enthalten muss.

Diese Änderung hat bei mir perfekt funktioniert.

tonderaimuchada
quelle
0

Etwas ungewöhnliche Ursache für dieses Problem, aber nur für den Fall, dass jemand es braucht. Der Code, an dem ich arbeitete, verwendete:

java.text.DateFormat.getDateTimeInstance()

um einen Datumsformatierer zu erhalten. Das von diesem Aufruf zurückgegebene Formatierungsmuster wurde von Java 8 auf Java 9 geändert, wie in diesem Fehlerbericht beschrieben: https://bugs.openjdk.java.net/browse/JDK-8152154 Anscheinend war die für mich zurückgegebene Formatierung nicht geeignet für die Datenbank. Die Lösung war stattdessen:

DateTimeFormatter.ISO_LOCAL_DATE_TIME
Wackelzähne
quelle