Je veux convertir une chaîne comme celle-ci:
'10/15/2008 10:06:32 PM'
dans la valeur DATETIME équivalente dans Sql Server.
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. Cela semble ridicule pour une opération aussi banale. Y a-t-il un moyen plus simple?
sql-server
tsql
datetime
sql-server-2005
string-to-datetime
JosephStyons
la source
la source
Réponses:
SQL Server (2005, 2000, 7.0) ne dispose d'aucun moyen flexible, voire non flexible, de prendre un datetime arbitrairement structuré au format chaîne et de le convertir en type de données datetime.
Par «arbitrairement», j'entends «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.
la source
9/6/12
signifiait le 6 septembre 2012, le 9 juin 2012, le 6 décembre 2009 ou autre chose?Essaye ça
et
Voir CAST et CONVERT (Transact-SQL) pour plus de détails.
la source
Cast('2011-07-07' as datetime)
fonctionne également et élimine l'ambiguïté sur l'ordre du mois et du jour.SET DATEFORMAT dmy
avant votre requêteExécutez-le via votre processeur de requêtes. Il met en forme des dates et / ou des heures comme ça et l'un d'eux devrait vous donner ce que vous recherchez. Il ne sera pas difficile de s'adapter:
la source
Dans SQL Server Denali, vous pourrez faire quelque chose qui se rapproche de ce que vous recherchez. Mais vous ne pouvez toujours pas simplement passer une chaîne de date farfelue définie arbitrairement et vous attendre à ce que SQL Server s'adapte. Voici un exemple utilisant quelque chose que vous avez publié dans votre propre réponse. La fonction FORMAT () peut également accepter les paramètres régionaux comme argument facultatif - elle est basée sur le format de .Net, donc la plupart sinon tous les formats de jetons que vous vous attendez à voir seront là.
Je vous encourage fortement à prendre plus de contrôle et à désinfecter vos entrées de date. L'époque où les gens pouvaient saisir des dates en utilisant le format de leur choix dans un champ de formulaire libre devrait être loin derrière nous. Si quelqu'un entre le 9 août 2011, est-ce le 9 août ou le 8 septembre? Si vous leur faites choisir une date sur un contrôle de calendrier, l'application peut contrôler le format. Peu importe combien vous essayez de prédire le comportement de vos utilisateurs, ils trouveront toujours un moyen plus stupide de saisir une date que vous n'avez pas prévue.
Jusqu'à Denali, cependant, je pense que @Ovidiu a le meilleur conseil à ce jour ... cela peut être rendu assez trivial en implémentant votre propre fonction CLR. Ensuite, vous pouvez écrire un cas / commutateur pour autant de formats non standard farfelus que vous le souhaitez.
MISE À JOUR pour @dhergert :
Résultats:
Vous devez tout d'abord avoir cette autre information cruciale. Vous ne pouvez pas utiliser T-SQL natif pour déterminer s'il
6/9/2012
s'agit du 9 juin ou du 6 septembre.la source
Pour ce problème, la meilleure solution que j'utilise est d'avoir une fonction CLR dans Sql Server 2005 qui utilise l'une des fonctions DateTime.Parse ou ParseExact pour renvoyer la valeur DateTime avec un format spécifié.
la source
Utilisez ceci:
Et reportez-vous au tableau de la documentation officielle pour les codes de conversion.
la source
pourquoi ne pas essayer
les formats de date peuvent être trouvés dans SQL Server Helper> Formats de date SQL Server
la source
select convert(date,'10/15/2011 00:00:00',101)
. Plus de détails sur le format et pourquoi 101, sur docs.microsoft.com/en-us/sql/t-sql/functions/…Il m'a fallu une minute pour comprendre cela, alors voici au cas où cela pourrait aider quelqu'un:
Dans SQL Server 2012 et mieux, vous pouvez utiliser cette fonction:
Voici comment j'ai fini par extraire les parties de la date à mettre dans cette fonction:
la source
Cette page contient des références pour toutes les conversions datetime spécifiées disponibles pour la fonction CONVERT. Si vos valeurs ne correspondent pas à l'un des modèles acceptables, je pense que la meilleure chose à faire est d'emprunter la voie ParseExact.
la source
Personnellement, si vous avez affaire à des formats arbitraires ou totalement décalés, à condition de savoir ce qu'ils sont à l'avance ou ce qu'ils vont être, utilisez simplement l'expression régulière pour extraire les sections de la date que vous voulez et former un composant date / date / heure valide.
la source
Je sais que c'est un vieux post méchant avec beaucoup de réponses, mais beaucoup de gens pensent qu'ils DOIVENT soit casser les choses et les remettre ensemble, soit insister sur le fait qu'il n'y a aucun moyen de faire implicitement la conversion demandée par l'OP original .
Pour passer en revue et, espérons-le, fournir une réponse facile aux autres avec la même question, l'OP a demandé comment convertir «10/15/2008 10:06:32 PM» en DATETIME. Maintenant, SQL Server a des dépendances linguistiques pour les conversions temporelles, mais si la langue est l'anglais ou quelque chose de similaire, cela devient un problème simple ... faites simplement la conversion et ne vous inquiétez pas du format. Par exemple (et vous pouvez utiliser CONVERT ou CAST) ...
... et cela produit les réponses suivantes, qui sont toutes deux correctes.
Comme on dit dans les publicités télévisées, "Mais attendez! Ne commandez pas encore! Sans frais supplémentaires, il peut faire BEAUCOUP plus!"
Voyons la puissance réelle des conversions temporelles avec DATETIME et examinons partiellement l'erreur connue sous le nom de DATETIME2. Découvrez les formats loufoques que DATETIME peut gérer automatiquement et que DATETIME2 ne peut pas. Exécutez le code suivant et consultez ...
Donc, oui ... SQL Server a en fait une méthode assez flexible pour gérer toutes sortes de formats temporels bizarres et aucune manipulation particulière n'est requise. Nous n'avons même pas eu besoin de supprimer les "PM" qui ont été ajoutés aux heures de 24 heures. C'est "PFM" (Pure Freakin 'Magic).
Les choses varieront un peu en fonction de la LANGUE que vous avez sélectionnée pour votre serveur, mais une grande partie sera gérée de toute façon.
Et ces conversions "auto-magiques" ne sont pas quelque chose de nouveau. Ils remontent très loin.
la source
Si vous voulez que SQL Server essaie de le comprendre, utilisez simplement CAST CAST ('quel que soit' comme date / heure). Cependant, c'est une mauvaise idée en général. Il y a des problèmes avec les dates internationales qui pourraient survenir. Donc, comme vous l'avez constaté, pour éviter ces problèmes, vous souhaitez utiliser le format canonique ODBC de la date. C'est le format numéro 120, 20 est le format pour les années à deux chiffres seulement. Je ne pense pas que SQL Server ait une fonction intégrée qui vous permet de fournir un format donné à l'utilisateur. Vous pouvez écrire le vôtre et même en trouver un si vous effectuez une recherche en ligne.
la source
convertir implicitement une chaîne en datetime dans MSSQL
la source
la source