Consulta SQL para inserir data e hora no SQL Server


133

Quero inserir um datetimevalor em uma tabela (SQL Server) usando a consulta sql abaixo

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

Mas eu recebo esta mensagem de erro. Incorrect syntax near '10'.

Eu tentei com as aspas

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

Recebo esta mensagem de erro Cannot convert varchar to datetime

Por favor, ajude! Obrigado.

Respostas:


229

Você deseja usar o AAAAMMDD para determinação inequívoca de data no SQL Server.

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

Se você é casado com o dd-mm-yy hh:mm:ss xmformato, precisará usar CONVERT com o estilo específico.

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

5aqui é o estilo para datas italianas. Bem, não apenas italianos, mas essa é a cultura à qual é atribuída nos Books Online .


1
Obrigado .. Funciona. Aliás, não é possível entrar no formato DD-MM-AA?
Shee

@RichardTheKiwi o que 5significa?
Shee

@Shee see rodapé adicionado para responder
RichardTheKiwi

4
Eu estou corrigido - se você estiver usando YYYYMMDD HH:MM:SS(no formato de 24 horas - o formato mundial, qualquer pessoa, exceto os EUA, usa isso, não apenas os militares ...) sem os traços - funciona, mesmo para o Britishidioma. Se você usar YYYY-MM-DD HH:MM:SSno entanto, ele falhará - nesse caso (com os traços), será necessário separar data e hora com um Tliteral.
marc_s

1
@ Shee Dê uma olhada na SET DATEFORMATdeclaração . Essa é a configuração para uma conexão individual, mas a configuração pode ser especificada em todo o servidor. Você também pode especificar SET LANGUAGEpara controlar coisas como qual caractere é usado para o radix e tal, e o formato da data será herdado disso (novamente, nos níveis de servidor ou conexão). O padrão é inglês dos EUA e mdy é o formato dos EUA. ymd com datas de 4 anos sempre funciona, no entanto.
Bacon Bits

29

Uma opção mais independente de idioma para literais de cadeia de caracteres é o padrão internacional ISO 8601, formato "AAAA-MM-DDThh: mm: ss". Usei a consulta SQL abaixo para testar o formato e, de fato, funciona em todas as linguagens SQL em 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

De acordo com a seção Formatos literais de data e hora da seqüência de caracteres no Microsoft TechNet, o formato de data padrão ANSI SQL padrão "AAAA-MM-DD hh: mm: ss" deve ser "multilíngue". No entanto, usando a mesma consulta, o formato ANSI não funciona em todos os idiomas SQL.

Por exemplo, em dinamarquês, você encontrará muitos erros como o seguinte:

Erro no idioma dinamarquês A conversão de um tipo de dados varchar em um tipo de dados datetime resultou em um valor fora do intervalo.

Se você deseja criar uma consulta em C # para execução no SQL Server e precisar passar uma data no formato ISO 8601, use o especificador de formato Classificável "s" :

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

Parece que você pode usar YYYYMMDDpara apenas data, e quer YYYY-MM-DDThh:mm:ss(com traços, e sim, um Tentre data e parte do tempo!) Ou YYYYMMDD HH:MM:SS(sem traços, não literais separação) para ser verdadeiramente independente idioma ...
marc_s

1
@marc_s: Obrigado pelo comentário. Editei minha resposta para mencionar o formato ISO 8601 (que inclui o literal T como você mencionou).
Paul Williams

inserir nos valores @TestLang (langdate) ('2012-06-18T10: 34: 09') é a melhor resposta.
MERT DOĞAN

20

O estúdio de gerenciamento cria scripts como:

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

8

você precisa adicioná-lo como

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

2

Não há necessidade de usar convert. Basta listá-lo como uma data citada no formato ISO 8601.
Igual a:

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

O separador precisa ser um /e precisa estar entre 'aspas simples .


1

Se você estiver armazenando valores através de qualquer linguagem de programação

Aqui está um exemplo em c #

Para armazenar a data, você deve convertê-la primeiro e depois armazená-la

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

FooDate é uma variável datetime que contém sua data em seu formato.


1

Encontro um problema mais genérico: obter diferentes formatos de data e hora (e não necessariamente conhecidos) e inseri-los na coluna data e hora. Eu o resolvi usando esta declaração, que finalmente se tornou uma função escalar (relevante para o estilo ODBC canônico, americano, ANSI e britânico \ data de franquia - pode ser expandida):

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))) 
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.