Conversione fallita durante la conversione di data e/o ora da una stringa di caratteri durante l'inserimento di datetime

Stavo cercando di creare una tabella come segue,

create table table1(date1 datetime,date2 datetime);

Prima ho provato a inserire i valori come segue,

insert into table1 values('21-02-2012 6:10:00 PM','01-01-2001 12:00:00 AM');

Ha dato errore dicendo,

Non è possibile convertire varchar in datetime.

Poi ho provato sotto il formato come uno dei post suggeriti dal nostro stackoverflow,

insert into table1 values(convert(datetime,'21-02-2012 6:10:00 PM',5)
                          ,convert(datetime,'01-01-2001 12:00:00 AM',5));

Ma sto ancora ottenendo l'errore che dice,

Conversione fallita durante la conversione di data e/o ora da una stringa di caratteri.

Qualche suggerimento?

Soluzione

Ci sono molti formati supportati da SQL Server - vedi i MSDN Books Online su CAST e CONVERT. La maggior parte di questi formati sono dipendenti dalle impostazioni che avete - quindi, queste impostazioni potrebbero funzionare a volte - e a volte no.

Il modo per risolvere questo problema è quello di utilizzare il (leggermente adattato) formato di data ISO-8601 che è supportato da SQL Server - questo formato funziona sempre - indipendentemente dalla vostra lingua di SQL Server e dalle impostazioni del formato di data.

Il formato ISO-8601 è supportato da SQL Server in due versioni:

  • YYYMMDD per le sole date (nessuna parte temporale); nota qui: nessun trattino!, è molto importante! YYYY-MM-DD è NON indipendente dalle impostazioni del formato della data nel tuo SQL Server e NON funzionerà in tutte le situazioni!

oppure:

  • YYYY-MM-DDTHH:MM:SS per le date e gli orari - nota qui: questo formato ha i trattini (ma possono essere omessi), e una T fissa come delimitatore tra la data e la porzione di tempo del tuo DATETIME.

Questo è valido per SQL Server 2000 e successivi.

Quindi nel tuo caso concreto - usa queste stringhe:

insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');

e dovresti essere a posto (nota: devi usare il formato internazionale 24 ore piuttosto che il formato 12 ore AM/PM per questo).

In alternativa: se sei su SQL Server 2008 o più recente, potresti anche usare il tipo di dato DATETIME2 (invece del semplice DATETIME) e il tuo attuale INSERT funzionerebbe senza problemi! :-) DATETIME2 è molto meglio e molto meno esigente nelle conversioni - ed è comunque il tipo di dati data/ora raccomandato per SQL Server 2008 o più recente.

SELECT
   CAST('02-21-2012 6:10:00 PM' AS DATETIME2),     -- works just fine
   CAST('01-01-2012 12:00:00 AM' AS DATETIME2)   -- works just fine  

Non chiedetemi perché questo argomento è così complicato e in qualche modo confuso - è così e basta. Ma con il formato YYYMMDD, dovresti essere a posto per qualsiasi versione di SQL Server e per qualsiasi lingua e impostazione di formato di data nel tuo SQL Server.

Commentari (3)

La conversione nel server SQL a volte non riesce a causa dei formati di data o ora utilizzati, è semplicemente perché si sta cercando di memorizzare dati sbagliati che non sono accettabili per il sistema.

Esempio:

Create Table MyTable (MyDate);

Inserire in MyTable (MyDate) i valori ('2015-02-29');`

Il server SQL lancerà il seguente errore:

Conversion failed when converting date and/or time from character string.

La ragione di questo errore è semplicemente che non esiste una data (Feb-29) nell'anno (2015).

Commentari (2)

Risposta semplice - 5 è italiano "yy" e 105 è italiano "yyyy". Pertanto:

SELECT convert(datetime,'21-02-12 6:10:00 PM',5)

funzionerà correttamente, ma

SELECT convert(datetime,'21-02-12 6:10:00 PM',105)

darà errore.

Allo stesso modo,

SELECT convert(datetime,'21-02-2012 6:10:00 PM',5)

darà errore, dove come

SELECT convert(datetime,'21-02-2012 6:10:00 PM',105)

funzionerà.

Commentari (0)