Query SQL per inserire datetime in SQL Server


133

Voglio inserire un datetimevalore in una tabella (SQL Server) usando la query sql di seguito

insert into table1(approvaldate)values(18-06-12 10:34:09 AM);

Ma ricevo questo messaggio di errore. Incorrect syntax near '10'.

L'ho provato con le virgolette

insert into table1(approvaldate)values('18-06-12 10:34:09 AM');

Ricevo questo messaggio di errore Cannot convert varchar to datetime

Gentile aiuto! Grazie.

Risposte:


229

Si desidera utilizzare il AAAAMMGG per determinare in modo univoco la data in SQL Server.

insert into table1(approvaldate)values('20120618 10:34:09 AM');

Se sei sposato con il dd-mm-yy hh:mm:ss xmformato, dovrai usare CONVERT con lo stile specifico.

insert table1 (approvaldate)
       values (convert(datetime,'18-06-12 10:34:09 PM',5));

5ecco lo stile per le date italiane. Beh, non solo gli italiani, ma questa è la cultura a cui è attribuita nei libri online .


1
Grazie .. Funziona. A proposito, non è possibile entrare nel formato GG-MM-AA?
Shee,

@RichardTheKiwi cosa 5significa?
Shee,

@Shee vedi piè di pagina aggiunto per rispondere
RichardTheKiwi

4
Sono corretto - se stai usando YYYYMMDD HH:MM:SS(nel formato 24 ore - il formato mondiale, chiunque tranne gli Stati Uniti lo usa, non solo i militari ....) senza trattini - funziona, anche per la Britishlingua. Se si utilizza YYYY-MM-DD HH:MM:SSinvece, non riesce - in questo caso (con i trattini), è necessario per la data e l'ora separata con un Tletterale.
marc

1
@Shee Dai un'occhiata alla SET DATEFORMATdichiarazione . Questa è l'impostazione per una singola connessione, ma l'impostazione può essere specificata a livello di server. Puoi anche specificare SET LANGUAGEdi controllare cose come quale carattere viene usato per Radix e simili, e il formato della data erediterà da quello (di nuovo, a livello di server o di connessione). È solo che l'impostazione predefinita è l'inglese americano e mdy è il formato americano. ymd con date di 4 anni funziona sempre, comunque.
Bacon Bits

29

Una scelta più indipendente dalla lingua per i letterali di stringa è lo standard internazionale ISO 8601 formato "AAAA-MM-GGThh: mm: ss". Ho usato la query SQL di seguito per testare il formato e funziona davvero in tutti i linguaggi SQL in sys.syslanguages :

declare @sql nvarchar(4000)

declare @LangID smallint
declare @Alias sysname

declare @MaxLangID smallint
select @MaxLangID = max(langid) from sys.syslanguages

set @LangID = 0

while @LangID <= @MaxLangID
begin

    select @Alias = alias
    from sys.syslanguages
    where langid = @LangID

    if @Alias is not null
    begin

        begin try
            set @sql = N'declare @TestLang table (langdate datetime)
    set language ''' + @alias + N''';
    insert into @TestLang (langdate)
    values (''2012-06-18T10:34:09'')'
            print 'Testing ' + @Alias

            exec sp_executesql @sql
        end try
        begin catch
            print 'Error in language ' + @Alias
            print ERROR_MESSAGE()
        end catch
    end

    select @LangID = min(langid)
    from sys.syslanguages
    where langid > @LangID
end

In base alla sezione String Literal Date e Time Formats in Microsoft TechNet, il formato di data SQL standard ANSI standard "AAAA-MM-GG hh: mm: ss" dovrebbe essere "multi-lingua". Tuttavia, utilizzando la stessa query, il formato ANSI non funziona in tutti i linguaggi SQL.

Ad esempio, in danese, compaiono molti errori come i seguenti:

Errore nella lingua danese La conversione di un tipo di dati varchar in un tipo di dati datetime ha prodotto un valore fuori range.

Se si desidera creare una query in C # per l'esecuzione su SQL Server e si deve passare una data nel formato ISO 8601, utilizzare l' identificatore del formato "s" ordinabile :

string.Format("select convert(datetime2, '{0:s}'", DateTime.Now);

Sembra che tu possa usare YYYYMMDDsolo per la data, e YYYY-MM-DDThh:mm:ss(con trattini e sì, Ttra una porzione di data e ora!) O YYYYMMDD HH:MM:SS(senza trattini, senza separazione letterale) per essere veramente indipendente dalla lingua ...
marc_s

1
@marc_s: grazie per il commento. Ho modificato la mia risposta per menzionare il formato ISO 8601 (che include il letterale T come hai menzionato).
Paul Williams,

inserire in @TestLang (langdate) i valori ('2012-06-18T10: 34: 09') è la risposta migliore.
MERT DOĞAN,

20

Management Studio crea script come:

insert table1 (foodate) values(CAST(N'2012-06-18 10:34:09.000' AS DateTime))

8

devi aggiungerlo come

insert into table1(date1) values('12-mar-2013');

2

Non è necessario utilizzare convert. Elencalo semplicemente come una data indicata nel formato ISO 8601.
Così:

select * from table1 where somedate between '2000/01/01' and '2099/12/31'

Il separatore deve essere a /e deve essere racchiuso tra 'virgolette singole .


1

Se si memorizzano valori tramite qualsiasi linguaggio di programmazione

Ecco un esempio in C #

Per memorizzare la data devi prima convertirla e poi memorizzarla

insert table1 (foodate)
   values (FooDate.ToString("MM/dd/yyyy"));

FooDate è una variabile datetime che contiene la tua data nel tuo formato.


1

Mi imbatto in un problema più generico: ottenere formati di datetime diversi (e non necessariamente noti) e inserirli nella colonna datetime. L'ho risolto usando questa affermazione, che alla fine è diventata una funzione scalare (rilevante per lo stile di data canonico ODBC, americano, ANSI e britannico \ franchising - può essere espansa):

insert into <tableName>(<dateTime column>) values(coalesce 
(TRY_CONVERT(datetime, <DateString, 121), TRY_CONVERT(datetime, <DateString>, 
101), TRY_CONVERT(datetime, <DateString>, 102), TRY_CONVERT(datetime, 
<DateString>, 103))) 
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.