217 votes

Sql Server string à la date de conversion

Je veux convertir une chaîne de caractères comme ceci:

'10/15/2008 10:06:32 PM'

en l'équivalent de la valeur de type DATETIME de Sql Server.

Dans Oracle, je voudrais dire ceci:

TO_DATE('10/15/2008 10:06:32 PM','MM/DD/YYYY HH:MI:SS AM')

Cette question implique que je dois analyser la chaîne dans l'un des formats standard, et ensuite de les convertir à l'aide de l'un de ces codes. Qui semble ridicule pour une banale opération. Est-il un moyen plus facile?

349voto

gauravg Points 97

Essayez ceci

Cast('7/7/2011' as datetime)

et

Convert(varchar(30),'7/7/2011',102)

58voto

Exécuter le biais de votre processeur de requête. Il formats de dates et/ou heures comme et un de ces vous donner ce que vous cherchez. Il ne sera pas difficile de s'adapter:

Declare @d datetime
select @d = getdate()

select @d as OriginalDate,
convert(varchar,@d,100) as ConvertedDate,
100 as FormatValue,
'mon dd yyyy hh:miAM (or PM)' as OutputFormat
union all
select @d,convert(varchar,@d,101),101,'mm/dd/yy'
union all
select @d,convert(varchar,@d,102),102,'yy.mm.dd'
union all
select @d,convert(varchar,@d,103),103,'dd/mm/yy'
union all
select @d,convert(varchar,@d,104),104,'dd.mm.yy'
union all
select @d,convert(varchar,@d,105),105,'dd-mm-yy'
union all
select @d,convert(varchar,@d,106),106,'dd mon yy'
union all
select @d,convert(varchar,@d,107),107,'Mon dd, yy'
union all
select @d,convert(varchar,@d,108),108,'hh:mm:ss'
union all
select @d,convert(varchar,@d,109),109,'mon dd yyyy hh:mi:ss:mmmAM (or PM)'
union all
select @d,convert(varchar,@d,110),110,'mm-dd-yy'
union all
select @d,convert(varchar,@d,111),111,'yy/mm/dd'
union all
select @d,convert(varchar,@d,112),112,'yymmdd'
union all
select @d,convert(varchar,@d,113),113,'dd mon yyyy hh:mm:ss:mmm(24h)'
union all
select @d,convert(varchar,@d,114),114,'hh:mi:ss:mmm(24h)'
union all
select @d,convert(varchar,@d,120),120,'yyyy-mm-dd hh:mi:ss(24h)'
union all
select @d,convert(varchar,@d,121),121,'yyyy-mm-dd hh:mi:ss.mmm(24h)'
union all
select @d,convert(varchar,@d,126),126,'yyyy-mm-dd Thh:mm:ss:mmm(no spaces)'

50voto

Aaron Bertrand Points 116343

Dans SQL Server Denali, vous serez en mesure de faire quelque chose qui s'approche de ce que vous cherchez. Mais vous ne pouvez pas passer tout arbitraire défini loufoque chaîne de date et d'attendre SQL Server pour accueillir. Voici un exemple d'utilisation de quelque chose que vous avez posté votre propre réponse. La fonction FORMAT() et ne peut accepter que des localités comme un argument facultatif - il est basé sur .Net format, de sorte que la plupart, si pas tous les formats de jetons que vous vous attendez à voir sera là.

DECLARE @d DATETIME = '2008-10-13 18:45:19';

-- returns Oct-13/2008 18:45:19:
SELECT FORMAT(@d, N'MMM-dd/yyyy HH:mm:ss');

-- returns NULL if the conversion fails:
SELECT TRY_PARSE(FORMAT(@d, N'MMM-dd/yyyy HH:mm:ss') AS DATETIME);

-- returns an error if the conversion fails:
SELECT PARSE(FORMAT(@d, N'MMM-dd/yyyy HH:mm:ss') AS DATETIME);

Je vous encourage fortement à prendre plus de contrôle et de désinfecter votre date d'entrées. Les jours de laisser les gens entrez des dates à l'aide de n'importe quel format ils veulent dans un freetext champ de formulaire devrait être derrière nous maintenant. Si quelqu'un entre dans 8/9/2011 est que le 9 ou le 8 septembre? Si vous leur faites choisir une date sur un calendrier de contrôle, l'application peut contrôler le format. Peu importe combien vous essayez de prédire le comportement des utilisateurs, ils vont toujours trouver un dumber façon d'entrer une date que vous n'avez pas de plan pour.

Jusqu'à Denali, cependant, je pense que @Ovidiu a les meilleurs conseils pour l'instant... ce qui peut être fait assez trivial par la mise en œuvre de votre propre fonction CLR. Ensuite, vous pouvez écrire un cas, à un commutateur pour autant loufoque formats non standard que vous le souhaitez.


Mise à JOUR pour @dhergert:

SELECT TRY_PARSE('10/15/2008 10:06:32 PM' AS DATETIME USING 'en-us');
SELECT TRY_PARSE('15/10/2008 10:06:32 PM' AS DATETIME USING 'en-gb');

Résultats:

2008-10-15 22:06:32.000
2008-10-15 22:06:32.000

Vous avez encore le besoin d'avoir d'autres information cruciale première. Vous ne pouvez pas utiliser de T-SQL natif de déterminer si 6/9/2012 est le 9 juin ou le 6 septembre.

32voto

Philip Kelley Points 19032

SQL Server (2005, 2000, 7.0) n'a pas de flexible, ou même les non-flexible, de façon à prendre arbitrairement structuré datetime au format de chaîne et de la convertir dans le type de données datetime.

Par "arbitrairement", je veux dire "une forme que la personne qui l'a écrit, mais peut-être pas vous ou moi ou de quelqu'un, de l'autre côté de la planète, l'on pourrait considérer être intuitif et évident." Franchement, je ne suis pas sûr qu'il y est un tel algorithme.

10voto

Ovidiu Pacurar Points 5129

Pour ce problème, la meilleure solution que j'utilise est d'avoir une fonction CLR dans Sql Server 2005 qui utilise l'un de DateTime.D'analyser ou de ParseExact fonction pour renvoyer la valeur DateTime avec un format spécifié.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X