SQL Server supporta il formato ISO 8601 per la specifica dei valori di data e ora.
L'utilità di utilizzare tale formato è che l'interpretazione della data espressa è indipendente dalla localizzazione (come detto negli articoli precedenti, in cui viene usato il formato ISO yyyymmdd). L'elenco completo dello standard lo si trova qui:
http://www.mcs.vuw.ac.nz/technical/software/SGML/doc/iso8601/ISO8601.html
e da una lettura dello stesso si può dedurre che i pattern yyyymmdd e yyyy-mm-dd dovrebbero essere trattati in modo identico.
Per SQL Server, però, il formato ISO è definito solamente dal seguente pattern:
yyyy-mm-ddThh:mm:ss[.nnn]
Questo significa che pensare che i formati yyyy-mm-dd e yyyymmdd siano identici, quando si parla di SQL Server, è errato.
I BOL sono chiari (ma non a sufficienza):
"To use the ISO 8601 format, you must specify each element in the format. This also includes the punctuation marks that are shown in the format."
Tradotto in pratica, l'esempio che dimostra il funzionamento dei vari formati è questo:
SET DATEFORMAT DMY
SELECT CAST('20060501' as datetime) -- Corretto: 1 Maggio 2006
SELECT CAST('2006-05-01T00:00:00' as datetime) -- Corretto: 1 Maggio 2006
SELECT CAST('2006-05-01' as datetime) -- Sbagliato: 5 Gennaio 2006
SELECT CAST('2006-05-01 00:00:00' as datetime) -- Sbagliato: 5 Gennaio 2006
L'utilizzo del SET DATEFORMAT è necessario per dimostrare l'errore, in quanto, se si usasse invece il formato MDY (quello inglese per intenderci), l'errore non si presenterebbe e la data verrebbe riconosciuta correttamente anche in presenza di una stringa che non rappresenta un formato ISO riconosciuto da SQL Server.