J'ai reçu l'erreur suivante lors de l'exécution d'un SQL pour convertir la valeur de mon type de données de varchar
à datetime
.
Msg 242, niveau 16, état 3, ligne 1 La conversion d'un type de données varchar en un type de données datetime a abouti à une valeur hors plage.
J'ai vérifié les données et je ne vois rien d'étrange: j'ai effectué les vérifications suivantes et je n'ai renvoyé aucun résultat
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
Y a-t-il autre chose qui vaut la peine d'être examiné et qui mérite peut-être des conseils ou une aide sur ce problème? Je n'arrive pas à comprendre.
sql-server
tsql
datetime
user23495
la source
la source
Réponses:
J'ai été confronté au même problème il y a une semaine. Le problème vient du réglage du fuseau horaire. Spécifiez dans d'autres formats comme mm / jj / aaaa (fonctionne généralement).
Spécifier la date au 30/12/2013 a entraîné l'erreur pour moi. Cependant, le spécifier au format mm / jj / aaaa fonctionnait.
Si vous avez besoin de convertir votre entrée, vous pouvez essayer de rechercher la
CONVERT
méthode. La syntaxe estCONVERT(VARCHAR,@your_date_Value,103)
CONVERT(VARCHAR, '12/30/2013', 103)
La finition 103 est le format datetime.
Reportez-vous à ce lien pour connaître les formats de conversion et lire davantage https://www.w3schools.com/sql/func_sqlserver_convert.asp
la source
SELECT CONVERT(char(10), GetDate(),126)
. Remplacez simplement GETDATE () par la valeur nécessaire.Je suis tombé sur ce problème en raison d'une erreur stupide. Assurez-vous que la date existe réellement!
Par exemple:
Le 31 septembre 2015 n'existe pas.
EXEC dbo.SearchByDateRange @Start = '20150901' , @End = '20150931'
Donc, cela échoue avec le message:
Pour résoudre ce problème, saisissez une date valide:
EXEC dbo.SearchByDateRange @Start = '20150901' , @End = '20150930'
Et il s'exécute très bien.
la source
Format(DateTime.Now, "yyyymmdd")
quand ça aurait dû êtreFormat(DateTime.Now, "yyyyMMdd")
J'ai eu un problème similaire récemment. Les paramètres régionaux ont été correctement configurés à la fois dans l'application et le serveur de base de données. Cependant, l'exécution de SQL a entraîné
Le problème était la langue par défaut de l'utilisateur de la base de données.
Pour le vérifier ou le modifier dans SSMS, accédez à Sécurité -> Connexions et cliquez avec le bouton droit sur le nom d'utilisateur de l'utilisateur qui exécute les requêtes. Sélectionnez propriétés -> général et assurez-vous que la langue par défaut au bas de la boîte de dialogue correspond à ce que vous attendez.
Répétez cette opération pour tous les utilisateurs qui exécutent des requêtes.
la source
server login
nondb user
. top-password.com/blog/…English
enBritish English
et cela a fonctionné!Vous pouvez utiliser
Set dateformat <date-format> ;
dans votre fonction sp ou procédure stockée pour faire avancer les choses.
la source
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)))
la source
J'ai eu le même problème et j'ai déterminé que ce problème survient parce que SQL Server n'effectue pas de comparaisons sur les caractères convertis en nombres entiers de la même manière. Dans mon test, j'ai constaté que certaines comparaisons de caractères convertis, tels que le point d'exclamation, renverront des erreurs de conversion de type, tandis que d'autres comparaisons de caractères convertis, tels que l'espace, seront jugées hors limites.
Cet exemple de code teste les différents scénarios possibles et présente une solution à l'aide d'instructions REPLACE imbriquées. Le REMPLACER détermine s'il y a des caractères dans la chaîne qui ne sont pas des chiffres ou la barre oblique, et, s'il en existe, la longueur de la chaîne sera supérieure à zéro, indiquant ainsi qu'il y a des `` mauvais '' caractères et que la date n'est pas valide .
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
Production:
--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
la source
+ 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
la source
J'ai également rencontré ce problème lors de l'insertion automatique d'un sysdate dans une colonne.
J'ai changé le format de date de mon système pour qu'il corresponde au format de date du serveur SQL. par exemple, mon format SQL était mm / jj / aaaa et mon format système était défini sur jj / mm / aaaa. J'ai changé le format de mon système en mm / jj / aaaa et l'erreur a disparu
-kb
la source
Comme vous le savez, il s'agit d'un problème de format britannique. Vous pouvez effectuer une conversion de date indirectement en utilisant la fonction.
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
Pour appeler cette fonction
SELECT dbo.ChangeDateFormatFromUK([dates]) from table
Convertissez-le normalement en datetime
SELECT CONVERT(DATETIME,dbo.ChangeDateFormatFromUK([dates])) from table
Dans votre cas, vous pouvez faire
SELECT [dates] from table where CONVERT(DATETIME,dbo.ChangeDateFormatFromUK([dates])) > GetDate() -- or any date
la source
Test pour l'année> 2079. J'ai trouvé qu'un utilisateur a tapé 2106 au lieu de 2016 dans l'année (10/12/2106) et boom; Ainsi, le 12/10/2016, j'ai testé et trouvé SQL Server accepté jusqu'en 2078, j'ai commencé à lancer cette erreur si l'année est 2079 ou plus. Je n'ai pas fait de recherche supplémentaire sur le type de glissement de date de SQL Server.
la source
J'ai simplement converti le champ varchar que je voulais convertir en une nouvelle table (avec un champ DateTime) en une mise en page compatible DateTime, puis SQL effectuera la conversion de varchar à DateTime sans problème.
Dans ce qui suit (pas ma table créée avec ces noms!) Je fais simplement du champ varchar un sosie de DateTime si vous voulez:
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)
la source
Varchar Date Convert to Date and Change the Format
12 novembre 2016 12:00, 21/12/2016, 21-12-2016 cette requête fonctionne pour ci-dessus pour passer à ce format jj / MM / aaaa
SELECT [Member_ID],[Name] , Convert(varchar(50),Convert(date,[DOB],103),103) as DOB ,[NICNO],[Relation] FROM [dbo].[tbl_FamilMember]
la source
Cette erreur s'est produite pour moi parce que j'essayais de stocker la date et l'heure minimales dans une colonne à l'aide de requêtes en ligne directement à partir du code C #.
La variable de date a été définie sur 01/01/0001 12:00:00 AM dans le code étant donné que DateTime en C # est initialisé avec cette date et heure s'il n'est pas défini autrement. Et la date la plus petite possible autorisée dans le type de données datetime MS-SQL 2008 est 1753-01-01 12:00:00 AM.
J'ai changé la date du code et l'ai réglée sur 01/01/1900 et aucune erreur n'a été signalée.
la source
J'ai utilisé ToString () à une date avec mm au lieu de MM.
la source
Assurez-vous simplement que vos dates sont compatibles ou peuvent être exécutées correctement dans votre gestionnaire de base de données (par exemple SQL Server Management Studio). Par exemple, la fonction DateTime.Now C # n'est pas valide dans SQL Server, ce qui signifie que votre requête doit inclure des fonctions valides telles que GETDATE () pour SQL Server.
Ce changement a parfaitement fonctionné pour moi.
la source
Cause légèrement inhabituelle pour ce problème, mais juste au cas où quelqu'un en aurait besoin. Le code sur lequel je travaillais utilisait:
pour obtenir un formateur de date. Le modèle de formatage renvoyé par cet appel est passé de Java 8 à Java 9 comme décrit dans ce rapport de bogue: https://bugs.openjdk.java.net/browse/JDK-8152154 apparemment, le formatage qu'il renvoyait pour moi ne convenait pas pour la base de données. La solution était à la place:
la source