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?
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.
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).
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à.