2015-04-28 9 views
9

Non riesco a capire da the documentation perché SQL Server analizza un testo in un formato diverso dallo stile specificato.Perché SQL Server converte VARCHAR in DATETIME utilizzando uno stile non valido?

Indipendentemente dal fatto che fornisco il testo nel formato previsto:

SELECT CONVERT(DATETIME, N'20150601', 112) 

o non corretti formato (per stile 113):

SELECT CONVERT(DATETIME, N'20150601', 113) 

I risultati sono gli stessi: 2015-06-01 00:00:00.000 mi si aspetterebbe quest'ultimo non riuscire a convertire la data (correttamente).

Quali regole vengono utilizzate quando si tenta di convertire un VARCHAR in DATETIME? Cioè perché il secondo (stile di formato errato) analizza correttamente la data?

EDIT: Sembra che non sia stato abbastanza chiaro. Lo stile 113 dovrebbe prevedere dd mon yyyy hh:mi:ss:mmm(24h) ma converte felicemente i valori nel formato yyyymmdd per qualche motivo.

+1

Si sta restituendo il DATETIME, non una rappresentazione testuale del DATETIME, quindi lo stile è irrilevante. Se vuoi vedere lo stile fare qualcosa, converti nuovamente il DATETIME in un VARCHAR, ad es. SELECT CONVERT (VARCHAR (20), CONVERT (DATETIME, N'20150601 '), 113) –

+0

Forse una conversione implicita sta avvenendo prima della conversione effettiva? – Blim

+0

Eliminata la mia risposta, ma 'Quando espressione è un tipo di dati data o ora, lo stile può essere uno dei valori mostrati nella seguente tabella'. Hai ** non ** ottenuto un'espressione datetime. – Mackan

risposta

6

Poiché la data è in un formato canonico ovvero (20150101). Il motore del database lo cade implicitamente. Questa è una caratteristica di compatibilità.

Se si sono scambiati questi in formato data UK o USA, si riceveranno errori di conversione, perché non possono essere convertiti implicitamente.

EDIT: Si potrebbe effettivamente dire che per convertirlo in un maiale, e sarebbe ancora implicitamente convertirlo in data ora:

select convert(datetime,'20150425',99999999) 
select convert(datetime,'20150425',100) 
select convert(datetime,'20150425',113) 
select convert(datetime,'20150425',010) 
select convert(datetime,'20150425',8008135) 
select convert(datetime,'20150425',000) 

e la prova di concetto che questa è una caratteristica di compatibilità:

select convert(datetime2,'20150425',99999999) 

Sebbene sia ancora possibile convertire in modo implicito oggetti datetime2, lo stile deve essere compreso nell'ambito del diagramma di conversione.

+0

2015-01-01 il formato non funziona lo stesso però. – Blim

+0

Buon posto. Questo perché aggiungi stili alla stringa della data. –

+0

Il mio punto è che non viene convertito implicitamente come il formato yyyyMMdd – Blim

-1

è necessario convertire a varchar tipo, al fine di applicare tali formati:

SELECT CONVERT(varchar(100), CAST('20150601' as date), 113) 

OK, si sta convertendo datetime-datetime. Cosa ti aspettavi? Per applicare i formati, è necessario convertire in varchar e il tipo di data o ora deve essere impostato come secondo parametro.

+1

La mia domanda è perché converte * in 'DATETIME' *, non come viene visualizzato. –

1

Motivo per cui la data N'20150601' convertita in data/ora valida è perché di fatto il valore letterale N'20150601' è la notazione universale di data/ora in SQL Server. Ciò significa che se si specifica il valore data/ora nel formato N'yyyymmdd ', SQL Server sa che è un formato datetime universale e sa come leggerlo, in quale ordine.

+0

si applicano a 'NVARCHAR' e' VARCHAR' allo stesso modo. Prova 'SELECT CONVERT (DATETIME, N'03/06/2015 ', 113)' per vedere che lo stile viene applicato. –

Problemi correlati