Come analizzare la stringa in data?


Risposte:




22

Supponendo che il database sia MS SQL Server 2012 o versione successiva, ecco una soluzione che funziona. L'istruzione di base contiene il try-parse in linea:

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

Ecco cosa abbiamo implementato nella versione di produzione:

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';

Le colonne ModifiedOn e ModifiedBy servono solo per il monitoraggio del database interno.

Vedi anche questi riferimenti Microsoft MSDN:


Ciò presuppone che l'OP stia utilizzando Sql Server 2012+
Mark Kram

8

Sebbene la cosa CONVERT funzioni, in realtà non dovresti usarla. Dovresti chiederti perché stai analizzando i valori di stringa in SQL-Server. Se questo è un lavoro occasionale in cui stai correggendo manualmente alcuni dati, non otterrai quei dati un'altra volta, va bene, ma se qualsiasi applicazione lo sta usando, dovresti cambiare qualcosa. Il modo migliore sarebbe utilizzare il tipo di dati "data". Se questo è un input dell'utente, è anche peggio. Quindi dovresti prima fare un po 'di controllo nel client. Se vuoi davvero passare valori stringa in cui SQL-Server si aspetta una data, puoi sempre utilizzare il formato ISO ('AAAAMMGG') e dovrebbe convertirsi automaticamente.


5
Che ne dici di una situazione in cui stai importando file di dati da un sistema esterno e la colonna di input si trova in uno di questi formati, ad esempio "05/31/2013", ma che si presenta come una stringa? E stai scrivendo, diciamo, una procedura memorizzata per importare quei dati o stai usando SSIS per importarli? Allora CONVERT sarebbe la cosa appropriata da usare, no?
David Barrows

Non necessariamente, nelle situazioni in cui MS SQL Server ospita modelli di dati analitici, al contrario di quelli di transazione, è perfettamente corretto utilizzare CONVERT perché deve gestire molte fonti esterne che non sarebbero prontamente disponibili come tipo di data (come David Barrows ha accennato sopra).
Il

Il formato letterale stringa predefinito per le date è AAAA-MM-GG
AA


1
CONVERT(DateTime, ExpireDate, 121) AS ExpireDate

farà ciò che è necessario, risultato:

2012-04-24 00:00:00.000

Ciò non sembra funzionare per ciò che l'OP ha pubblicato anche per diverse impostazioni della lingua. Provalo. Se effettivamente funziona per te, inserisci la tua impostazione della lingua corrente. Grazie. Ecco il codice per provare ... SELEZIONA CONVERT (DateTime, '24 .04.2012 ', 121) AS ExpireDate
Jeff Moden
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.