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."
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)
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.
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.
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.
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)
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:
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.
yyyyMMdd
yyyy-MM-dd
ou yyyy-MM-ddThh:mm:ss
Plus de détails sur ISO8601Tout format de culture spécifique entraînera des ennuis tôt ou tard ...
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))
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)
Cela semble le moyen le plus simple ..
SELECT REPLACE(CONVERT(CHAR(10), GETDATE(), 110),'-','')
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.
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.
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à.