2010-05-21 5 views
2

J'ai un varchar sur le terrain (14) = 20090226115644SQL Server varchar datetime

Je dois le convertir en -> 2009-02-26 11:56:44 (format datetime)

Mon idée. utiliser cast et convertir .. mais j'ai toujours des erreurs.

La conversion a échoué lors de la conversion date/heure à partir de la chaîne de caractères.

J'ai fait, mais il n'aime ..

SELECT 
    SUBSTRING(move,1,4) + '-' + SUBSTRING(move,5,2) + '-' + SUBSTRING(move,7,2) + ' ' + SUBSTRING(move,9,2) + ':' + SUBSTRING(move,11,2) + ':'+SUBSTRING(move,13,2) as new -- 
FROM [Test].[dbo].[container_events] 
where move IS not null 

Résultat: 2009-02-26 11:56:44

+0

Pouvez-vous poster le code d'affaire et de conversion afin que nous puissions savoir quels types d'erreurs que vous rencontrez – vodkhang

Répondre

1

L'opérateur CAST dans SQL Server a un puits liste définie des formats pris en charge - voir MSDN SQL Server Books Online. Votre format ne semble pas correspondre à ces formats définis -> vous êtes seul, vous devez utiliser une logique personnalisée (comme vous le faites) pour amener ce champ varchar dans un format que CAST peut comprendre .

Alors, quelle est votre question maintenant ??

1

votre logique semble correcte et fonctionne pour les données données. Cependant, je parie que vous avez de mauvaises données là-bas.

essayez ceci:

DECLARE @container_events table (PK int, move varchar(14)) 
SET NOCOUNT ON 
INSERT INTO @container_events VALUES (1,'20090226115644') 
INSERT INTO @container_events VALUES (2,'20090226116644') 
INSERT INTO @container_events VALUES (3,'20090227010203') 
INSERT INTO @container_events VALUES (4,'20090228010203') 
INSERT INTO @container_events VALUES (5,'20090229010203') 
SET NOCOUNT OFF 

---list all bad dates 
SELECT 
    SUBSTRING(move,1,4) + '-' + SUBSTRING(move,5,2) + '-' + SUBSTRING(move,7,2) + ' ' + SUBSTRING(move,9,2) + ':' + SUBSTRING(move,11,2) + ':'+SUBSTRING(move,13,2) as BadDatesOnly, move 
FROM @container_events 
where ISDATE(SUBSTRING(move,1,4) + '-' + SUBSTRING(move,5,2) + '-' + SUBSTRING(move,7,2) + ' ' + SUBSTRING(move,9,2) + ':' + SUBSTRING(move,11,2) + ':'+SUBSTRING(move,13,2))=0 


---list all bad dates 
SELECT 
    CONVERT(datetime,SUBSTRING(move,1,4) + '-' + SUBSTRING(move,5,2) + '-' + SUBSTRING(move,7,2) + ' ' + SUBSTRING(move,9,2) + ':' + SUBSTRING(move,11,2) + ':'+SUBSTRING(move,13,2)) as GoodDatesOnly, move 
FROM @container_events 
where ISDATE(SUBSTRING(move,1,4) + '-' + SUBSTRING(move,5,2) + '-' + SUBSTRING(move,7,2) + ' ' + SUBSTRING(move,9,2) + ':' + SUBSTRING(move,11,2) + ':'+SUBSTRING(move,13,2))=1 

SORTIE:

BadDatesOnly  move 
------------------- -------------- 
2009-02-26 11:66:44 20090226116644 
2009-02-29 01:02:03 20090229010203 

(2 row(s) affected) 

GoodDatesOnly   move 
----------------------- -------------- 
2009-02-26 11:56:44.000 20090226115644 
2009-02-27 01:02:03.000 20090227010203 
2009-02-28 01:02:03.000 20090228010203 

(3 row(s) affected) 

Utilisation de la fonction ISDATE (Transact-SQL) vous pouvez déterminer si la date est valide ou non. En conséquence, vous pouvez filtrer les mauvaises lignes dans votre requête, ou trouver les mauvaises lignes et les corriger, etc. C'est à vous de décider quoi faire avec les mauvaises données.