2012-04-24 14 views

risposta

102
CONVERT(datetime, '24.04.2012', 104) 

dovrebbe fare il trucco. Vedi qui per ulteriori informazioni: "CAST and CONVERT (Transact-SQL)"

+3

Non funziona. TSQL mostra questo errore: sintassi errata vicino alla parola chiave "CONVERT". – pordi

+0

Rimuovere lo spazio tra CONVERT e Paren: CONVERT (datetime, '24 .04.2012 ', 104) – MAbraham1

+0

Come spiegato nel documento collegato, il' 104 'indica la formattazione della stringa di input. – DCShannon

24

Microsoft SQL Date Formats

CONVERT(DateTime, DateField, 104) 
+0

'24-04- 2012' non sarà riconosciuta come data valida perché si aspetta 'MM-gg-aaaa' – Khan

+2

e che ne dite di' CONVERT (DateTime, DateField, 104) '? Questo dovrebbe dire al server SQL di usare il formato gg.mm.aaaa ... – therealmitchconnors

+0

Sì, funziona, ho trovato anche io, grazie! –

6

Anche se la cosa funziona CONVERTI, che in realtà non dovrebbe usarlo. Dovresti chiederti perché stai analizzando i valori stringa in SQL-Server. Se si tratta di un lavoro occasionale in cui si stanno aggiustando manualmente alcuni dati non si otterranno quei dati un'altra volta, questo è ok, ma se un'applicazione sta usando questo, si dovrebbe cambiare qualcosa. Il modo migliore sarebbe utilizzare il tipo di dati "data". Se questo è l'input dell'utente, questo è anche peggio. Quindi dovresti prima fare un controllo sul client. Se si desidera veramente passare valori stringa in cui SQL-Server si aspetta una data, è sempre possibile utilizzare il formato ISO ('AAAAMMGG') e convertirlo automaticamente.

+3

Che dire di una situazione in cui si importano file di dati da un sistema esterno e la colonna di input si trova in uno di questi formati, ad es."31/05/2013", ma che entra come una stringa? E stai scrivendo, per esempio, una stored procedure per importare quei dati, o usando SSIS per importarli? Allora CONVERT sarebbe la cosa giusta da usare, non sarebbe? –

+0

Non necessariamente, nelle situazioni in cui i modelli di dati analitici host di MS SQL Server, al contrario di quelli di transazione, è perfettamente accettabile utilizzare CONVERT perché deve gestire un sacco di fonti esterne che non sarebbero prontamente disponibili in una data tipo (come accennato in precedenza da David Barrows). – Will

+0

Il formato letterale stringa predefinito per le date è [AAAA-MM-GG] (https://docs.microsoft.com/en-us/sql/t-sql/data-types/date-transact-sql) –

10

Ecco una soluzione che funziona bene. La dichiarazione di base contiene il parse try-in-line:

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 sono solo per scopi di monitoraggio database interno.

Vedi anche le indicazioni suddette Microsoft MSDN:

+0

Utilizziamo questo nel codice di produzione. – MAbraham1

0
CONVERT(DateTime, ExpireDate, 121) AS ExpireDate 

farà ciò che è necessario, risultato:

2012-04-24 00:00:00.000 
Problemi correlati