web-dev-qa-db-fra.com

Convertir varchar en date / heure dans SQL Server

Comment convertir une chaîne de format mmddyyyy en datetime dans SQL Server 2008?

Ma colonne cible est dans DateTime

J'ai essayé avec Convert et la plupart des valeurs de style Date, mais je reçois un message d'erreur:

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

62
Developer

OP veut mmddyy et un simple converti ne fonctionnera pas pour ça:

select convert(datetime,'12312009')

Msg 242, Level 16, State 3, Line 1 
The conversion of a char data type to a datetime data type resulted in 
an out-of-range datetime value

alors essayez ceci:

DECLARE @Date char(8)
set @Date='12312009'
SELECT CONVERT(datetime,RIGHT(@Date,4)+LEFT(@Date,2)+SUBSTRING(@Date,3,2))

SORTIE:

-----------------------
2009-12-31 00:00:00.000

(1 row(s) affected)
72
KM.

SQL Server peut implicitement convertir des chaînes sous la forme "AAAAMMJJ" en une date/heure - toutes les autres chaînes doivent être explicitement converties. Voici deux blocs de code rapides qui effectueront la conversion à partir du formulaire dont vous parlez:

la version 1 utilise des variables d'unité:

BEGIN 
DECLARE @input VARCHAR(8), @mon CHAR(2), 
@day char(2), @year char(4), @output DATETIME

SET @input = '10022009'   --today's date


SELECT @mon = LEFT(@input, 2), @day = SUBSTRING(@input, 3,2), @year = RIGHT(@input,4)

SELECT @output = @year+@mon+@day 
SELECT @output 
END

la version 2 n'utilise pas de variables d'unité:

BEGIN 
DECLARE @input CHAR(8), @output DATETIME
SET @input = '10022009' --today's date 

SELECT @output = RIGHT(@input,4) + SUBSTRING(@input, 3,2) + LEFT(@input, 2)

SELECT @output
END

Les deux cas reposent sur la capacité du serveur SQL à effectuer cette conversion implicite.

7
nick

J'ai trouvé cela utile pour ma conversion, sans manipulation de chaîne. https://docs.Microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql

CONVERT(VARCHAR(23), @lastUploadEndDate, 121)

aaaa-mm-jj hh: mi: ss.mmm était le format dont j'avais besoin.

5
Stephen Himes

Vous avez probablement de mauvaises données qui ne peuvent pas être converties. Les dates ne doivent jamais être stockées dans varchar, car elles autoriseront des dates telles que ASAP ou 02/30/2009. Utilisez la fonction isdate () sur vos données pour rechercher les enregistrements qui ne peuvent pas être convertis.

OK, j'ai testé avec de bonnes données connues et j'ai quand même reçu le message. Vous devez convertir dans un format différent, car il ne sait pas si 12302009 est mmddyyyy ou ddmmyyyy. Le format de aaaammjj n'est pas ambigu et SQL Server le convertira correctement

J'ai eu ceci au travail:

cast( right(@date,4) + left(@date,4) as datetime)

Vous obtiendrez quand même un message d'erreur si vous en avez dans un format non standard comme '112009' ou une valeur de texte ou une date vraie hors limites.

4
HLGEM

Convertir serait la réponse normale, mais le format n'est pas reconnu par le convertisseur. Vous pouvez convertir mm/jj/aaaa à l'aide de convert (datetime, yourdatestring, 101), mais vous ne disposez pas de ce format.

Le problème est que le format est non standard, vous devrez le manipuler selon un standard que convert peut comprendre parmi ceux disponibles.

Hacked ensemble, si vous pouvez garantir le format

declare @date char(8)
set @date = '12312009'
select convert(datetime, substring(@date,5,4) + substring(@date,1,2) + substring(@date,3,2),112)
4
Andrew

Regardez CAST/CONVERT dans BOL qui devrait être un début.

Si votre colonne cible est datetime vous n'avez pas besoin de la convertir, SQL le fera pour vous.

Autrement

CONVERT(datetime, '20090101')

Devrait le faire.

Ceci est un lien qui devrait aussi aider:

3
JonH

J'utilisais STUFF pour insérer des caractères de division, puis CONVERT avec le style approprié. Quelque chose comme ça:

DECLARE @dt VARCHAR(100)='111290';
SELECT CONVERT(DATETIME,STUFF(STUFF(@dt,3,0,'/'),6,0,'/'),3)

Tout d'abord, vous utilisez deux fois STUFF pour obtenir le 11/12/90 au lieu de 111290, puis vous utilisez 3 pour le convertir en datetime (ou tout autre format approprié: utilisez . pour l'allemand, - pour le britannique ...) Plus de détails sur CAST and CONVERT

Le mieux était de stocker correctement les valeurs de date et d’heure.

  • Ce doit être soit "format universel non séparé" yyyyMMdd
  • ou (surtout dans XML) ce devrait être ISO8601: yyyy-MM-dd ou yyyy-MM-ddThh:mm:ssPlus de détails sur ISO8601

Tout format de culture spécifique entraînera des ennuis tôt ou tard ...

2
Shnugo

J'ai eu de la chance avec quelque chose de similaire:

Convert(DATETIME, CONVERT(VARCHAR(2), @Month) + '/' + CONVERT(VARCHAR(2), @Day)
+ '/' + CONVERT(VARCHAR(4), @Year))
1
Ryan

use Try_Convert: Renvoie une valeur convertie dans le type de données spécifié si la conversion réussit. sinon, renvoie null.

DECLARE @DateString VARCHAR(10) ='20160805'
SELECT TRY_CONVERT(DATETIME,@DateString)

SET @DateString ='Invalid Date'
SELECT TRY_CONVERT(DATETIME,@DateString)

Lien: MSDN TRY_CONVERT (Transact-SQL)

1
Shahab J

Cela semble le moyen le plus simple ..

SELECT REPLACE(CONVERT(CHAR(10), GETDATE(), 110),'-','')
0
Daniel Folz

Je pense que CONVERT est le meilleur choix car vous pouvez inclure un style (format de date), donc le paramètre par défaut pour les États-Unis serait 110, mm-jj-aaaa.

0
Kevin Horgan

Dates standard SQL lors de l'insertion ou de la mise à jour Doit être comprise entre le 1/1/1753 00:00:00 et le 31/12/9999 23:59:59.

Donc, si vous insérez/mettez à jour au-dessous de 1/1/1753, vous obtiendrez cette erreur.

0
mounesh hiremani

La cause première de ce problème peut être dans les paramètres régionaux - DB en attente de AAAA-MM-JJ alors qu'une application s'affiche, par exemple, JJ-MM-AAAA (format régional russe), comme c'était le cas dans mon cas. Tout ce que j'ai fait - changer le format local de russe en anglais (États-Unis) et voilà.

0
Denis Maslov