Come formattare le date in stringa su SQL Server con le funzioni Cast, Convert e Format

Cast, convert e format su SQL Server

In questo articolo vediamo come convertire su SQL Server una data in una stringa con un particolare formato. Analizzeremo e confronteremo in particolare tre funzioni: CAST, CONVERT e FORMAT.

 

Perché non possiamo usare sempre la funzione CAST

Un primo metodo per convertire una data in una stringa consiste nell’utilizzare la funzione CAST. Però, non si tratta sempre di una buona idea poiché su SQL Server CAST è una funzione non deterministica. Ciò vuol dire che, a parità di codice, potrebbe restituire valori diversi. Ad esempio, il risultato di questa istruzione

SELECT CAST(GETDATE() AS VARCHAR(50));

dipende dalla lingua della sessione in cui viene eseguita. Ricordo che su SQL Server la lingua non è un’impostazione a livello di istanza, ma può variare da login a login, a meno che non sovrascriviamo esplicitamente il valore a livello di sessione con l’istruzione SET LANGUAGE. Analizziamo questo codice:

SET LANGUAGE Italian;
SELECT CAST(GETDATE() AS VARCHAR(50));
SET LANGUAGE us_english;
SELECT CAST(GETDATE() AS VARCHAR(50));

Otterremo due output diversi:

  • gen 4 2023 6:19PM
  • Jan 4 2023 6:19PM.

Questa differenza non si manifesta sempre, ad esempio utilizzando SYSDATETIME() invece di GETDATE() otterrei in tutti e due casi lo stesso risultato:

2023-01-04 18:21:03.2475761

Comunque, se vogliamo una funzione che possiamo utilizzare in tutti i casi, l’esempio con GETDATE ci mostra come CAST non sia quella giusta.

 

Come utilizzare la funzione CONVERT

La funzione CONVERT ha una sintassi differente da CAST: ho la possibilità di specificare un terzo parametro con un codice numerico per codificare lo stile che avrà la stringa di output. In questa pagina puoi trovare vari esempi sull’utilizzo di questi codici https://www.mssqltips.com/sqlservertip/1145/date-and-time-conversions-using-sql-server/, in particolare è molto utilizzato lo stile 21 con formato yyyy-mm-dd hh:mm:ss:nnn, oppure lo stile 23 con il formato yyyy-mm-dd senza l’orario.

Ad esempio l’istruzione

SELECT CONVERT(VARCHAR(50),
               GETDATE(),
               21);

può restituire un valore come 2023-01-04 18:30:28.050. Notiamo comunque che convertendo un valore di tipo date con lo stile 21 non avremo in output l’orario. Ad esempio

SELECT CONVERT(VARCHAR(50),
               CAST(GETDATE() AS DATE),
               21);

restituirà semplicemente 2023-01-04.

Tramite la funzione REPLACE è possibile formattare i valori ottenuti eliminando i caratteri separatori. Analogamente, potrei combinare gli stili 112 e 114 per ottenere un formato utile per creare un timestamp da inserire nel nome di un file.

SELECT CONVERT(VARCHAR(50),GETDATE(),112)
       + '_'
       + REPLACE(CONVERT(VARCHAR(50),GETDATE(),114),
                 ':',
                 '');

Concludiamo con due osservazioni importanti:

corso di analisi dei dati
Se vuoi diventare un esperto (qualunque sia il tuo livello di partenza) ti invito a visitare l’anteprima gratuita della piattaforma –> La Scuola dei Dati <–
 

Funzione FORMAT su SQL Server: occhio alle performance!

La funzione FORMAT di SQL Server permette di specificare il formato di output in maniera più esplicita rispetto ai codici della funzione CONVERT. Ad esempio posso scrivere

SELECT FORMAT(GETDATE(),'yyyy-MM-dd HH:mm:ss');

per ottenere la data nel formato 2023-01-04 18:47:44. Facciamo attenzione al fatto che il formato indicato è case sensitive, ad esempio indicando le ore con le lettere minuscole hh invece di HH, otterrei l’orario nel formato tra le 00 e le 12. 

Tuttavia la funzione FORMAT presenta degli importanti problemi di performance, di conseguenza sconsiglio il suo utilizzo se non in casi estremamente particolari. Puoi trovare più dettagli su questo tema in questo articolo https://sqlperformance.com/2015/06/t-sql-queries/format-is-nice-and-all-but. Per altri utilizzi della funzione FORMAT, puoi invece approfondire a questo link https://www.sqlshack.com/a-comprehensive-guide-to-the-sql-format-function/

 

Continua a imparare

Torna in alto
Torna su