Beim Ausführen einer SQL zum Konvertieren meines Datentypwerts von varchar
nach 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.
sql-server
tsql
datetime
user23495
quelle
quelle
Antworten:
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
CONVERT
Methode zu untersuchen. Syntax istCONVERT(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
quelle
SELECT CONVERT(char(10), GetDate(),126)
. Ersetzen Sie einfach GETDATE () durch den erforderlichen Wert.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:
Geben Sie ein gültiges Datum ein, um das Problem zu beheben:
EXEC dbo.SearchByDateRange @Start = '20150901' , @End = '20150930'
Und es funktioniert gut.
quelle
Format(DateTime.Now, "yyyymmdd")
wann es hätte sein sollenFormat(DateTime.Now, "yyyyMMdd")
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
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.
quelle
server login
Nichtdb user
. top-password.com/blog/…English
auf geändertBritish English
und es hat funktioniert!Sie können nutzen
Set dateformat <date-format> ;
in Ihrer SP-Funktion oder gespeicherten Prozedur, um Dinge zu erledigen.
quelle
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)))
quelle
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
quelle
+ 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
quelle
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
quelle
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
quelle
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.
quelle
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)
quelle
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]
quelle
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.
quelle
Ich habe ToString () an einem Datum mit mm anstelle von MM verwendet.
quelle
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.
quelle
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:
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:
quelle