web-dev-qa-db-fra.com

SQL - La conversion d'un type de données varchar en un type de données datetime a entraîné une valeur hors limites

L'erreur suivante s'affiche 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, Etat 3, Ligne 1 La conversion d'un type de données varchar en un type de données datetime a entraîné une valeur hors limites.

J'ai vérifié les données et je ne vois rien d'étrange: A exécuté les vérifications suivantes et toutes ne renvoyant 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 mérite d'être regardé et qui mérite peut-être des conseils ou de l'aide pour résoudre ce problème? Je n'arrive pas à comprendre le fond de la question.

58
user23495

J'ai rencontré le 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 tels que mm/jj/aaaa (fonctionne généralement).

Spécifier la date comme le 30/12/2013 a entraîné l'erreur pour moi. Cependant, le spécifier en tant que format mm/jj/aaaa a fonctionné.

Si vous avez besoin de convertir votre entrée, vous pouvez regarder dans la méthode CONVERT. La syntaxe est

CONVERT(VARCHAR,@your_date_Value,103)

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

La finition 103 est le format de date/heure.

Reportez-vous à ce lien pour les formats de conversion et pour en savoir plus. https://www.w3schools.com/sql/func_sqlserver_convert.asp

65
Mahe

J'ai rencontré 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:

Error converting data type varchar to datetime.

Pour résoudre ce problème, entrez une date valide:

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

Et ça fonctionne très bien.

45
Mr. C

J'ai eu le même problème récemment. Les paramètres régionaux ont été correctement configurés dans l'application et le serveur de base de données. Cependant, l’exécution de SQL a entraîné 

"La conversion d'un type de données varchar en un type de données datetime a entraîné une valeur hors limites". 

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, allez à Sécurité -> Connexions et cliquez avec le bouton droit de la souris 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 à vos attentes.

Répétez cette opération pour tous les utilisateurs qui exécutent des requêtes.

15
ali

Vous pouvez utiliser 

Set dateformat <date-format> ;

dans votre fonction sp ou procédure stockée pour faire avancer les choses.

7
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

J'ai moi aussi rencontré ce problème lors de l'insertion automatique d'une sysdate dans une colonne.

Ce que j'ai fait, c’est que j’ai modifié le format de date de mon système pour le faire correspondre au format de date du serveur SQL .exmon format SQL était mm/jj/aaaa et le format de mon 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 est partie

-kb

2
user5714464

J'ai eu le même problème et déterminé que ce problème se posait car SQL Server n'effectue pas de comparaisons sur des caractères convertis en entiers de manière identique. Lors de mon test, j'ai constaté que certaines comparaisons de caractères convertis, telles que le point d'exclamation, renverraient des erreurs de conversion de type, tandis que d'autres comparaisons de caractères convertis, telles que l'espace, seraient déterminées comme étant 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 REMPLACEMENT 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 est invalide .

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

Sortie:

--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

Test pour l'année> 2079 ... J'ai constaté qu'un utilisateur avait saisi 2106 au lieu de 2016 dans l'année (10/12/2106) et boum; Ainsi, le 10/12/2016, j'ai testé et constaté que SQL Server acceptait jusqu'en 2078 et commençait à lancer cette erreur si l'année est 2079 ou plus. Je n'ai pas fait d'autres recherches sur le type de date que glisse SQL Server.

2
gordon

Comme vous le savez, il s’agit d’un problème de formatage britannique. Vous pouvez faire la conversion de date indirectement en utilisant function.

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

Appeler cette fonction 

SELECT dbo.ChangeDateFormatFromUK([dates]) from table

Convertissez-le normalement en date/heure

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
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

12 nov. 2016 12 h 00, 21/12/2016, 21-12-2016 Cette requête fonctionne pour que ci-dessus passe à 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]

1
Khalid

J'ai simplement converti le champ varchar que je voulais convertir en une nouvelle table (avec un fichier DateTime) en un format compatible DateTime, puis SQL effectuera la conversion de varchar en DateTime sans problèmes. 

Dans la liste ci-dessous (ce n'est pas la table créée avec ces noms!), Je fais simplement en sorte que le champ varchar soit un sosie 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)  
1
Andre

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 de code C #. 

La variable de date a été définie sur 01/01/0001 00:00:00 dans le code, compte tenu du fait que DateTime en C # est initialisé avec cette date et cette heure si elles ne sont pas définies autrement. Et la date la plus courte 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 au 01/01/1900 et aucune erreur n'a été signalée plus tard.

0
Talha Imam

J'ai utilisé ToString () sur une date avec mm au lieu de MM.

0
L0uis

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.

0
Tonderai Muchada