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


164

Stavo cercando di creare una tabella come segue,

create table table1(date1 datetime,date2 datetime);

Per prima cosa ho provato a inserire valori come di seguito,

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

Ha restituito un errore dicendo:

Impossibile convertire varchar in datetime

Quindi ho provato sotto il formato come uno dei post suggerito 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 ricevendo l'errore che dice:

Conversione non riuscita durante la conversione di data e / o ora dalla stringa di caratteri

Eventuali suggerimenti?


2
@Damien_The_Unbeliever come hai detto, ho già fatto riferimento a questo post stackoverflow.com/questions/12957635/… prima di porre questa domanda. Ci hanno chiesto di utilizzare 'inserisci valori table1 (approvati) (convert (datetime, '18 -06-12 10:34:09 PM', 5)); ' ma non funziona
Mari

Risposte:


163

Esistono molti formati supportati da SQL Server: consultare la documentazione online di MSDN su CAST e CONVERT . La maggior parte di questi formati dipende dalle impostazioni che hai - quindi, queste impostazioni potrebbero funzionare alcune volte - e talvolta no.

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

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

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

o:

  • YYYY-MM-DDTHH:MM:SSper date e ore - nota qui: questo formato ha trattini (ma possono essere omessi) e un fisso Tcome delimitatore tra la data e l'ora della tua DATETIME.

Questo è valido per SQL Server 2000 e versioni successive.

Quindi, nel tuo caso concreto, usa queste stringhe:

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

e dovresti andare bene (nota: per questo devi usare il formato internazionale 24 ore anziché il formato 12 ore AM / PM).

In alternativa : se utilizzi SQL Server 2008 o versioni successive, puoi anche utilizzare il DATETIME2tipo di dati (anziché semplice DATETIME) e il tuo attuale INSERTfunzionerebbe senza problemi! :-) DATETIME2è molto meglio e molto meno esigente nelle conversioni - ed è comunque consigliato i tipi di dati data / ora per SQL Server 2008 o successivi.

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 sia così complicato e un po 'confuso: è così. Ma con il YYYYMMDDformato, dovresti andare bene per qualsiasi versione di SQL Server e per qualsiasi impostazione di lingua e formato data nel tuo SQL Server.


1
Proprio come una nota, il casting come DATETIME2 funziona anche con 'YYYY-MM-DDTHH: MM: SSZ' (nota 'Z' - Ora Zulu alla fine per indicare il timestamp UTC). Ho questo errore durante il tentativo di inserire "2013-12-16T17: 21: 26Z" nel campo datetime. Giusto per chiarire, ISO 8601 è parzialmente supportato. Non supporta il tempo Zulu, nonostante sia menzionato nella documentazione. Probabilmente è un'impostazione che non ho avuto il tempo di capire, ma nel caso in cui qualcuno abbia lo stesso problema, tienilo a mente.
Michał,

3
Posso confermare che il formato della data "AAAAMMGG" funziona correttamente, provato su SQL Server 2014, come un modo per specificare una data letterale in una clausola WHERE. Molti carri armati a @marc_s
Giorgio Barchiesi il

1
La cosa DATETIME2 ha funzionato per me. Nel mio caso stavo importando uno script di database da un SQL Server in inglese a una versione spagnola di esso, quindi ogni volta lo stesso errore. Ho semplicemente sostituito nella sceneggiatura tutte le occorrenze "as DATETIME" in "as DATETIME2" e il problema è stato risolto.
Alejandro del Río,

24

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

Esempio:

Create Table MyTable (MyDate);

Insert Into MyTable(MyDate) Values ('2015-02-29');

Il server SQL genererà il seguente errore:

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

Il motivo di questo errore è semplicemente che non esiste una data del genere (29 febbraio) nell'anno (2015).


2
"La ragione di questo errore è semplicemente che non esiste una data del genere (29 febbraio) nell'anno (2015)" Questo era esattamente il motivo per cui stavo ricevendo questo errore. Questa risposta tiene conto della causa più comune di questo errore, a differenza delle altre risposte.
FirstFraktal

1
Ho importato dati da un foglio Excel in cui i valori null in realtà avevano "NULL" nella cella. Questo è stato impostato come una stringa "Null" nella tabella DB, quindi stava cercando di convertire la stringa "Null" in un datetime. Avrebbe dovuto svuotare le celle "NULL" in Excel. Sono un idiota: /
karol,

17

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

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


8

Basta aggiornare il formato della data come muggito

yyyy-MM-dd hh:MM:ss

Risolve il problema per me e funziona benissimo


2
Si prega di leggere le altre risposte già fornite. Questo formato funziona solo per te a causa delle DATEFORMATimpostazioni della sessione . Verifica questo eseguendo SET DATEFORMAT MDY;SELECT CAST('2017-08-07 00:00:00' AS datetime); SET DATEFORMAT DMY;SELECT CAST('2017-08-07 00:00:00' AS datetime);. Funzionerà in modo affidabile se aggiungi un Tseparatore ( yyyy-MM-ddTHH:mm:ss).
Dan Guzman,

1
Grazie mille sì hai ragione risolve il mio problema e ho letto le altre risposte fornite qui
Pronab Roy

8

Ove possibile, si dovrebbero evitare letterali di data / ora specifici per la cultura .

Esistono alcuni formati sicuri per fornire una data / ora letterale:

Tutti gli esempi per 2016-09-15 17:30:00

ODBC (il mio preferito, in quanto viene gestito immediatamente come il tipo reale )

  • {ts'2016-09-15 17:30:00'} - Timbro del tempo
  • {d'2016-09-15'} - Solo data
  • {t'17:30:00'} - Solo tempo

ISO8601 (il migliore per ovunque )

  • '2016-09-15T17:30:00'- Essere consapevoli di Tnel mezzo!

Non operato (piccolo rischio di essere interpretato erroneamente come numero)

  • '20160915' --solo per data pura

Buono a mente: le date non valide tendono a presentarsi con strani errori

  • Non c'è il 31 giugno o il 30 febbraio ...

Un motivo in più per strani errori di conversione: Ordine di esecuzione!

SQL Server è ben noto per fare le cose in un ordine di esecuzione che non ci si potrebbe aspettare. La tua dichiarazione scritta sembra che la conversione venga eseguita prima che avvenga un'azione correlata al tipo, ma il motore decide - perché mai - di fare la conversione in un passaggio successivo.

Ecco un ottimo articolo che spiega questo con esempi: Rusano.com: "t-sql-funzioni-non-implica-un-certo-ordine-di-esecuzione" ed ecco la domanda correlata .


3

il modo migliore è questo codice

"select * from [table_1] where date between convert(date,'" + dateTimePicker1.Text + "',105) and convert(date,'" + dateTimePicker2.Text + "',105)"

2
convert(datetime2,((SUBSTRING( ISNULL(S2.FechaReal,e.ETA),7,4)+'-'+ SUBSTRING( ISNULL(S2.FechaReal,e.ETA),4,2)+'-'+ SUBSTRING( ISNULL(S2.FechaReal,e.ETA),1,2) + ' 12:00:00.127')))  as fecha,

1
Se usi i backtick, anziché gli spazi iniziali, otterrai un ritorno a capo automatico.
Jesse W a Z - Rinunciato a SE l'

2

Il formato datetime attualmente in esecuzione sul server SQL è

yyyy-mm-dd hh:MM:ss

1
No, questo non è vero (oltre alla discrepanza di me M). Leggi il commento di Dan Guzman alla risposta di Pronab Roy. E leggi le altre risposte qui ...
Shnugo,

2

Per favore, prova questo.

SQL Server prevede le date nel formato MM / GG / AAAA, se l'inglese è impostato come lingua predefinita. Sto salvando il valore del datepicker nel database sql2008. Il mio tipo di campo è datetime nel database.dpdob è il mio nome del datepicker.

           Dim test = dpdob.Text.Replace("-", "/")
           Dim parts As String() = test.Split(New Char() {"/"c})
           Dim firstPart As String = parts(0)
           Dim thirdPart As String = parts(2)
           Dim secondPart As String = parts(1)
           Dim test1 = secondPart + "/" + firstPart + "/" + thirdPart
           Dim dob = test1

Ora usa dob nella tua query di inserimento.


1

Puoi provare questo codice

select (Convert(Date, '2018-04-01'))

1

Ho avuto questo problema durante il tentativo di concatenare getdate() in una stringa che stavo inserendo in un campo nvarchar.

Ho fatto un casting per aggirarlo:

 INSERT INTO [SYSTEM_TABLE] ([SYSTEM_PROP_TAG],[SYSTEM_PROP_VAL]) VALUES 
   (
    'EMAIL_HEADER',
    '<h2>111 Any St.<br />Anywhere, ST 11111</h2><br />' + 
        CAST(CAST(getdate() AS datetime2) AS nvarchar) + 
    '<br /><br /><br />'
   )

Questo è un esempio igienizzato. La parte chiave di ciò è:

...' + CAST(CAST(getdate() AS datetime2) AS nvarchar) + '...

Lanciato la data come datetime2, quindi nvarcharper concatenarla.



0

imposta Cultura in inglese dal file web.config

  <globalization uiCulture="en-US" culture="en-US" />

per esempio se imposti la cultura su arabo, il tempo sarà

22/09/2017 02:16:57 ص

e viene visualizzato l'errore: la conversione non è riuscita durante la conversione di data e / o ora dalla stringa di caratteri durante l'inserimento del datetime



0

Per me questo ha funzionato:

INSERT INTO [MyTable]
           ([ValidFrom]
           ,[ValidTo])
       VALUES
           ('2020-01-27 14:54:11.000'
           ,'2023-01-27 14:52:50.000')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.