Comment analyser la chaîne en date?


Réponses:




21

En supposant que la base de données est MS SQL Server 2012 ou supérieur, voici une solution qui fonctionne. L'instruction de base contient le try-parse en ligne:

SELECT TRY_PARSE('02/04/2016 10:52:00' AS datetime USING 'en-US') AS Result;

Voici ce que nous avons implémenté dans la version de production:

UPDATE dbo.StagingInputReview
 SET ReviewedOn = 
     ISNULL(TRY_PARSE(RTrim(LTrim(ReviewedOnText)) AS datetime USING 'en-US'), getdate()),
 ModifiedOn = (getdate()), ModifiedBy = (suser_sname())
 -- Check for empty/null/'NULL' text
 WHERE not ReviewedOnText is null 
   AND RTrim(LTrim(ReviewedOnText))<>''
   AND Replace(RTrim(LTrim(ReviewedOnText)),'''','') <> 'NULL';

Les colonnes ModifiedOn et ModifiedBy sont uniquement destinées au suivi de la base de données interne.

Consultez également ces références Microsoft MSDN:


Cela suppose que l'OP utilise Sql Server 2012+
Mark Kram

8

Bien que la chose CONVERT fonctionne, vous ne devriez pas l'utiliser. Vous devriez vous demander pourquoi vous analysez les valeurs de chaîne dans SQL-Server. S'il s'agit d'un travail ponctuel où vous corrigez manuellement certaines données, vous n'obtiendrez pas ces données une autre fois, c'est correct, mais si une application l'utilise, vous devez changer quelque chose. Le meilleur moyen serait d'utiliser le type de données "date". S'il s'agit d'une entrée utilisateur, c'est encore pire. Ensuite, vous devez d'abord procéder à l'enregistrement du client. Si vous voulez vraiment transmettre des valeurs de chaîne là où SQL-Server attend une date, vous pouvez toujours utiliser le format ISO ('YYYYMMDD') et il doit se convertir automatiquement.


5
Qu'en est-il d'une situation où vous importez des fichiers de données à partir d'un système externe, et la colonne d'entrée se trouve être dans l'un de ces formats, par exemple "31/05/2013", mais qui se présente sous forme de chaîne? Et vous écrivez, disons, une procédure stockée pour importer ces données ou utilisez SSIS pour les importer? Alors CONVERT serait la chose appropriée à utiliser, n'est-ce pas?
David Barrows

Pas nécessairement, dans les situations où MS SQL Server héberge des modèles de données analytiques, par opposition aux modèles de transaction, il est parfaitement acceptable d'utiliser CONVERT car il doit traiter de nombreuses sources externes qui ne seraient pas facilement disponibles en tant que type de date (comme David Barrows l'a mentionné ci-dessus).
Sera

Le format de chaîne littérale par défaut pour les dates est AAAA-MM-JJ
YB


1
CONVERT(DateTime, ExpireDate, 121) AS ExpireDate

fera ce qui est nécessaire, résultat:

2012-04-24 00:00:00.000

Cela ne semble pas fonctionner pour ce que l'OP a publié, même pour différents paramètres de langue. Essayez-le. Si cela fonctionne réellement pour vous, veuillez publier votre paramètre de langue actuel. Merci. Voici le code à essayer ... SELECT CONVERT (DateTime, '24 .04.2012 ', 121) AS ExpireDate
Jeff Moden
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.