Conversion de la chaîne de caractères du serveur Sql à la date

je veux convertir une chaîne comme celle-ci:

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

dans la valeur de DATETIME équivalente dans le serveur Sql.

dans Oracle, je dirais 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 , puis convertir en utilisant l'un de ces codes. Qui semble ridicule pour une banale opération. Est-il plus facile façon?

137
demandé sur Aaron Bertrand 2008-10-16 06:08:51

10 réponses

SQL Server (2005, 2000, 7.0) n'a aucune manière flexible, ou même non flexible, de prendre une datetime arbitrairement structurée en format chaîne et de la convertir au type de données datetime.

par "arbitrairement", je veux dire " une forme que la personne qui l'a écrite, mais peut-être pas vous ou moi ou quelqu'un de l'autre côté de la planète, considérerait comme intuitive et complètement évidente."Franchement, je ne suis pas sûr qu'il existe un tel algorithme.

28
répondu Philip Kelley 2008-10-29 20:33:16

Essayez cette

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

et

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

Voir CAST et CONVERT (Transact-SQL) pour plus de détails.

230
répondu gauravg 2015-09-22 16:36:40

exécutez ceci dans votre processeur de requête. Il formate les dates et / ou les heures comme ça et l'un d'eux devrait 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,12),12,'yymmdd'
union all
select @d,convert(varchar,@d,112),112,'yyyymmdd'
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)'
38
répondu Taptronic 2015-01-21 23:29:04

dans SQL Server Denali, vous serez en mesure de faire quelque chose qui s'approche de ce que vous recherchez. Mais vous ne pouvez toujours pas passer n'importe quelle chaine de date définie arbitrairement et vous attendre à ce que SQL Server s'adapte. Voici un exemple d'utilisation de quelque chose que vous avez posté votre propre réponse. La fonction FORMAT() et peut également accepter les locales comme argument optionnel - il est basé sur le format.net, donc la plupart sinon tous les formats de token que vous vous attendez à voir seront 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 d'assainir vos entrées date. Les jours de laisser les gens taper des dates en utilisant n'importe quel format qu'ils veulent dans un champ de formulaire en texte libre devraient être loin derrière nous maintenant. Si quelqu'un entre 8/9/2011 est-ce 9 août ou 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 pour entrer une date que vous vous n'avez pas prévu pour.

Jusqu'à Denali, cependant, je pense que @Ovidiu a le meilleur conseil jusqu'à présent... ceci peut être rendu assez trivial en implémentant votre propre fonction CLR. Ensuite, vous pouvez écrire un cas/switch pour autant de formats non standard farfelus que vous voulez.


mise à jour pour @dergert :

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 besoin d'avoir que autre information cruciale première. Vous ne pouvez pas utiliser le T-SQL natif pour déterminer si 6/9/2012 est le 9 Juin ou le 6 septembre.

33
répondu Aaron Bertrand 2012-10-31 19:03:11

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

10
répondu Ovidiu Pacurar 2008-10-16 02:29:47

pourquoi ne pas essayer

select convert(date,'10/15/2011 00:00:00',104) as [MM/dd/YYYY]

les formats de date peuvent être trouvés à SQL Server Helper > SQL Server Date Formats

7
répondu Scott Gollaglee 2011-12-19 10:02:43

cette page contient des références pour toutes les conversions datetime disponibles pour la fonction CONVERT. Si vos valeurs ne tombent pas dans l'un des modèles acceptables, alors je pense que la meilleure chose est d'aller dans la voie ParseExact.

2
répondu tvanfosson 2008-10-16 02:53:39

personnellement, si vous avez affaire à des formats arbitraires ou totalement déconnectés du mur, à condition que vous sachiez ce qu'ils sont en avance sur le temps ou vont l'être, alors utilisez simplement regexp pour tirer les sections de la date que vous voulez et former une date valide/composante datetime.

2
répondu SyWill 2012-04-01 15:32:45

si vous voulez que SQL Server essaie de le comprendre, utilisez CAST CAST('tout' en datetime) Cependant c'est une mauvaise idée en général. Il y a des questions avec des dates internationales qui se poseraient. Donc comme vous avez trouvé, pour éviter ces problèmes, vous voulez utiliser le format canonique ODBC de la date. C'est le format numéro 120, 20 est le format pour seulement deux chiffres années. Je ne pense pas que SQL Server ait une fonction intégrée qui vous permette de fournir un format donné par l'utilisateur. Vous pouvez écrire votre propre et pourrait même en trouver un si vous cherchez en ligne.

1
répondu Will Rickards 2008-10-16 02:50:26

utilisez ceci:

SELECT convert(datetime, '2018-10-25 20:44:11.500', 121) -- yyyy-mm-dd hh:mm:ss.mmm

et se référer au tableau de la documentation officielle pour les codes de conversion.

1
répondu Simone 2018-01-29 09:43:54