Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Conversione non riuscita durante la conversione di data e/o ora dalla stringa di caratteri durante l'inserimento di datetime

Esistono molti formati supportati da SQL Server:vedere la documentazione in linea di MSDN su CAST e CONVERT. La maggior parte di questi formati sono dipendenti su quali impostazioni hai - quindi, queste impostazioni potrebbero funzionare alcune volte - e talvolta no.

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

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

  • YYYYMMDD solo per date (nessuna porzione di tempo); nota qui:nessun trattino! , è molto importante! YYYY-MM-DD è NON indipendente dalle impostazioni del formato della data nel tuo SQL Server e NON lavora in tutte le situazioni!

oppure:

  • YYYY-MM-DDTHH:MM:SS per date e orari - nota qui:questo formato ha trattini (ma loro possono essere omesso) e una T fissa come delimitatore tra la data e l'ora del tuo DATETIME .

Questo è valido per SQL Server 2000 e versioni successive.

Quindi, nel tuo caso specifico, usa queste stringhe:

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

e dovresti stare bene (nota:devi usare l'internazionale 24 ore formato anziché in formato 12 ore AM/PM per questo).

In alternativa :se utilizzi SQL Server 2008 o più recente, puoi anche utilizzare DATETIME2 tipo di dati (invece di semplice DATETIME ) e il tuo attuale INSERT funzionerebbe senza problemi! :-) DATETIME2 è molto migliore e molto meno esigente per quanto riguarda le conversioni ed è comunque il tipo di dati di data/ora consigliato per SQL Server 2008 o versioni successive.

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 chiedermi perché l'intero argomento è così complicato e un po' confuso:è proprio così. Ma con il YYYYMMDD formato, dovresti andare bene per qualsiasi versione di SQL Server e per qualsiasi impostazione di lingua e formato della data nel tuo SQL Server.