Convertir varchar en datetime dans SQL Server

Comment convertir une chaîne de format mmddyyyy en {[1] } 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 donné lieu à une valeur hors plage.'

58
demandé sur ughai 2009-10-02 18:47:04

13 réponses

OP veut mmddyy et un simple convert ne fonctionnera pas pour cela:

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)
68
répondu KM. 2009-10-02 15:08:21

SQL Server peut implicitement convertir des chaînes Sous la forme 'YYYYMMDD' en une datetime - toutes les autres chaînes doivent être explicitement converties. voici deux blocs de code rapides qui feront la conversion à partir du formulaire dont vous parlez:

La Version 1 utilise des variables unitaires:

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

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é de sql server à effectuer cette conversion implicite.

7
répondu nick 2012-01-01 17:20:57

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 (24h) était le format dont j'avais besoin.

5
répondu Stephen Himes 2017-05-23 11:52:17

Convert serait la réponse normale, mais le format n'est pas un format reconnu pour le convertisseur, mm / jj / aaaa pourrait être converti en utilisant convert (datetime, yourdatestring, 101) mais vous n'avez pas ce format donc il échoue.

Le problème est que le format n'est pas standard, vous devrez le manipuler à un standard que le converti peut comprendre à partir de ceux disponibles.

Piraté 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
répondu Andrew 2009-10-02 14:54:39

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

OK j'ai testé avec de bonnes données connues et j'ai toujours eu le message. Vous devez convertir dans un format différent parce qu'il ne sait pas si 12302009 est mmddyyyy ou jjmmyyyy. Le format de AAAAMMJJ n'est pas ambigu et SQL Server le convertira correctement

Je eu que cela fonctionne:

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

Vous obtiendrez toujours un message d'erreur si vous en avez dans un format non standard comme '112009' ou une valeur de texte ou une vraie date hors plage.

4
répondu HLGEM 2012-06-21 14:06:31

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

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

Sinon

CONVERT(datetime, '20090101')

Devrait le faire.

C'est un lien qui devrait également aider:

3
répondu JonH 2015-07-09 05:56:51

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
répondu Ryan 2010-06-01 20:16:02

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

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

Abord, vous utilisez deux fois STUFF pour obtenir 11/12/90 au lieu de 111290, que vous utilisez le 3 convertir cette datetime (ou tout autre appareil format: utilisation de . pour l'allemand, - pour les britanniques...) Plus de détails sur CAST and CONVERT

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

  • cela devrait être soit " universel non séparé format " yyyyMMdd
  • ou (en particulier dans XML) il devrait être ISO8601: yyyy-MM-dd ou yyyy-MM-ddThh:mm:ss Plus de détails sur ISO8601

Tout format spécifique à la culture entraînera des problèmes tôt ou tard...

1
répondu Shnugo 2016-06-23 12:01:54

Use Try_Convert: renvoie une valeur convertie au 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
répondu Shahab J 2016-08-07 23:52:36

Je pense que CONVERT est le meilleur choix car vous pouvez inclure un style( format de date), donc la valeur par défaut des États-Unis serait 110 qui est mm-JJ-AAAA.

0
répondu Kevin Horgan 2009-10-02 14:54:42

La cause profonde de ce problème peut être dans les paramètres régionaux-DB en attente de AAAA-MM-JJ pendant qu'une application sents, par exemple, JJ-MM-AAAA (format de locale russe) comme c'était dans mon cas. Tout ce que j'ai fait - changer le format de locale du Russe à l'anglais (États-Unis) et voilà.

0
répondu Denis Maslov 2011-02-17 16:51:40

Cela semble le moyen le plus simple..

SELECT REPLACE(CONVERT(CHAR(10), GETDATE(), 110),'-','')
0
répondu Daniel Folz 2012-05-17 19:02:11

Les dates standard SQL lors de l'insertion ou de la mise à jour doivent être entre 1/1/1753 12:00:00 AM et 12/31/9999 11:59:59 PM.

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

0
répondu mounesh hiremani 2012-09-30 07:08:33