Comment analyser la chaîne en date?

85

Comment puis-je convertir une chaîne en date dans T-SQL?

Mon cas de test est la chaîne: '24.04.2012'

Nazar Terechkovych
la source

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:

MAbraham1
la source
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.

Eric
la source
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
4

Vous pouvez utiliser:

SELECT CONVERT(datetime, '24.04.2012', 103) AS Date

Référence: CAST et CONVERT (Transact-SQL)

Seann Alexander
la source
C'est intéressant que ça marche. Le format 103 est jj / mm / aaaa et 104 est jj.mm.aaaa.
Jeff Moden le
1
CONVERT(DateTime, ExpireDate, 121) AS ExpireDate

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

2012-04-24 00:00:00.000
JMMS Karunarathne
la source
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