none
Gravar em data com formatação brasileira no Sql Server RRS feed

  • Pergunta

  •  

     

    Olá Pessoal !

     

    Testei inserir o registro conforme instruções e parâmetros que seguem e o campo de data não está sendo gravado corretamente na base do SQL Server 2005 conforme o formato brasileiro, linhas destacadas:

    Code Snippet

     

    Dim dataAtual As DateTime = DateTime.Now

     

    '* INSERۂO TABELA PessoaUnidade ____________________________________________________________________________

    ' Sem Retorno significa que na consulta do access nao resultou nenhum registro e estes parametros serao utilizados neste insert para esse caso.

    Dim cmd_PessoaUnidade_SemRetorno As New SqlCommand("INSERT into PessoaUnidade (UP_PE_ID, UP_UN_ID, UP_GP_ID, UP_PS_ID, UP_DATA_DE, UP_DATA_ATE) values (@PE_ID, @Unidade, @Grupo, @UP_PS_ID, @UP_DATA_DE, @Data_ate);", connSQL_Membros)

     

    ' PE_ID -> UP_PE_ID (INSERT)

    cmd_PessoaUnidade_SemRetorno.Parameters.AddWithValue("@PE_ID", drSQL_Membros(0))

     

    ' UN_ID = 4 => Par¢quia Salvador

    cmd_PessoaUnidade_SemRetorno.Parameters.AddWithValue("@Unidade", 4)

    ' @UP_GP_ID

    cmd_PessoaUnidade_SemRetorno.Parameters.AddWithValue("@Grupo", 1)

    cmd_PessoaUnidade_SemRetorno.Parameters.AddWithValue("@UP_PS_ID", 6)

     

    cmd_PessoaUnidade_SemRetorno.Parameters.AddWithValue("UP_DATA_DE", Format(dataAtual, "dd/MM/yyyy"))

     

    'DateFormat.LongDate

    'DateTime.Now.ToShortDateString()

    'System.DateTime.Now.Date.ToString("dd/MM/yyyy")

    'Format(Now, "dd/MM/yyyy hh:mm:ss")

    'Format(DateTime.Now, "DD/MM/YYYY hh:MM")

    'Format(DateTime.Now, "dd/MM/aaaa HH:mm:ss") testar esse !!!

    'HH:mm:ss

    'dd/MM/aaaa

     

    cmd_PessoaUnidade_SemRetorno.Parameters.Add("@Data_ate", SqlDbType.DateTime).Value = DBNull.Value

     

    Dim daSQL_PessoaUnidade_SemRetorno As New SqlDataAdapter(cmd_PessoaUnidade_SemRetorno)

    'preenche o dataset

    daSQL_PessoaUnidade_SemRetorno.Fill(dsSetSQL_PessoaUnidade_SemRetorno)

     

     

    No SQL Server 2005 está gravando assim: 12/03/2008 00:00:00 (data atual de hoje, mas no formato incorreto, preciso no formato dd/MM/yyyy conforme especifiquei no código, mas não consegui, peço ajuda para descobrir o que pode ser para ajustar e funcionar....

     

    Aguardo retorno !

    quarta-feira, 3 de dezembro de 2008 13:46

Respostas

  •  Magno Machado wrote:
    Como posso tratar as datas do sql server no formato brasileiro?

     

    Olá Magno,

    Na verdade, o SQL Server não guarda a data no formato Americano, nem no formato Brasileiro, nem em cultura alguma.
     

    A data é guardada em um formato numérico, que tem conversão automática para o tipo DateTime do .NET e que você pode utilizar para formatar do jeito que você quiser...

    Lembre-se que uma coisa é como você guarda a informação, e outra coisa é como você mostra essa informação.

    Tudo o que você precisa fazer, é enviar um valor do tipo DateTime para o SQL Server, e ele se encarrega de guardar o valor numérico dessa data. Quando você for recuperar esse valor, você formata do jeito que você quiser.

    No seu exemplo:

     Dim dataAtual As DateTime
     dataAtual = DateTime.Now
    
     '...
     
     cmd_PessoaUnidade_SemRetorno.Parameters.AddWithValue("@UP_DATA_DE", dataAtual)
    


    Não se deixe influenciar por aquilo que você vê quando faz um SELECT na tabela através do Management Studio. O que você vê é apenas a formatação da data que a ferramenta está mostrando. Se o campo é DateTime/SmallDateTime, você formata como quiser...

     

     

    Para ficar mais tranquilo, quando estiver no Management Studio, peça para o SQL Server extrair a informação do campo data separadamente, para você ter certeza que ele está armazenando corretamente:

    SELECT
        DAY(campoData) As Dia, MONTH(campoData) As Mes, Year(CampoData) As Ano
    FROM
        SuaTabela
    

     

    Abraços,
    Caio Proiete

     


    Caio Proiete
    Microsoft MVP, MCT, MCPD, MCTS, MCSD
    http://caioproiete.net

    quarta-feira, 3 de dezembro de 2008 18:07
    Moderador

Todas as Respostas

  • Magno,

     

    Porque você precisa mandar pro SQL a data formata em DD/MM/YYYY ?

    O SQL Server armazena data no formato MM/DD/YYYY sempre, é que a data que passou, invertendo não gerou erro, mas se passasse 25/08/2008 por exemplo iria tratar 25 como mes e daria erro.

    Grava no formato do SQL depois converte quando ler.

     

     

    quarta-feira, 3 de dezembro de 2008 16:34
  •  

    Para gravar no formato SQL, posso usar dessa maneira, seguindo a sugestao do post anterior:

    Code Snippet

     

    cmd_PessoaUnidade_SemRetorno.Parameters.AddWithValue("@UP_DATA_DE", Format(dataAtual, "MM/dd/yyyy"))

     

     

     

    Mas me questiono porque na minha base antes inseriu valores do Access pro Sql Server e um exemplo de data inserida é a seguinte:

     

    17/11/2001 00:00:00

     

    Me parece estar no formato brasileiro, pois 17 é o dia.

     

    Como posso tratar as datas do sql server no formato brasileiro?

     

     

     

    Aguardo Ajuda !

    quarta-feira, 3 de dezembro de 2008 17:44
  •  Magno Machado wrote:
    Como posso tratar as datas do sql server no formato brasileiro?

     

    Olá Magno,

    Na verdade, o SQL Server não guarda a data no formato Americano, nem no formato Brasileiro, nem em cultura alguma.
     

    A data é guardada em um formato numérico, que tem conversão automática para o tipo DateTime do .NET e que você pode utilizar para formatar do jeito que você quiser...

    Lembre-se que uma coisa é como você guarda a informação, e outra coisa é como você mostra essa informação.

    Tudo o que você precisa fazer, é enviar um valor do tipo DateTime para o SQL Server, e ele se encarrega de guardar o valor numérico dessa data. Quando você for recuperar esse valor, você formata do jeito que você quiser.

    No seu exemplo:

     Dim dataAtual As DateTime
     dataAtual = DateTime.Now
    
     '...
     
     cmd_PessoaUnidade_SemRetorno.Parameters.AddWithValue("@UP_DATA_DE", dataAtual)
    


    Não se deixe influenciar por aquilo que você vê quando faz um SELECT na tabela através do Management Studio. O que você vê é apenas a formatação da data que a ferramenta está mostrando. Se o campo é DateTime/SmallDateTime, você formata como quiser...

     

     

    Para ficar mais tranquilo, quando estiver no Management Studio, peça para o SQL Server extrair a informação do campo data separadamente, para você ter certeza que ele está armazenando corretamente:

    SELECT
        DAY(campoData) As Dia, MONTH(campoData) As Mes, Year(CampoData) As Ano
    FROM
        SuaTabela
    

     

    Abraços,
    Caio Proiete

     


    Caio Proiete
    Microsoft MVP, MCT, MCPD, MCTS, MCSD
    http://caioproiete.net

    quarta-feira, 3 de dezembro de 2008 18:07
    Moderador
  • Mas por que então quando especifico um formato para incluir campo com data atual, não é exibido campo data com a formatação que especifiquei para inclusao ?? Acho estranho porque em outros inserts consegui inserir e visualizar no formato dd/MM/yyyy

    Code Snippet

     

    'cmd_PessoaUnidade_SemRetorno.Parameters.AddWithValue("@UP_DATA_DE", Format(dataAtual, "dd/MM/yyyy"))

     

     

    Gostaria de trabalhar com datas neste formato =>  dd/MM/yyyy

     

    Qual a melhor maneira de especificar o formato de data (dd/MM/yyyy - brasileiro) no vb.net para inserir no Sql Server?

    quarta-feira, 3 de dezembro de 2008 18:20
  •  Magno Machado wrote:

    Mas por que então quando especifico um formato para incluir campo com data atual, não é exibido campo data com a formatação que especifiquei para inclusao ?? Acho estranho porque em outros inserts consegui inserir e visualizar no formato dd/MM/yyyy

     

     

    Gostaria de trabalhar com datas neste formato =>  dd/MM/yyyy

     

    Qual a melhor maneira de especificar o formato de data (dd/MM/yyyy - brasileiro) no vb.net para inserir no Sql Server?

     

    Code Snippet

     

    'cmd_PessoaUnidade_SemRetorno.Parameters.AddWithValue("@UP_DATA_DE", Format(dataAtual, "dd/MM/yyyy"))

     

     


    Olá Magno,

    Foi o que eu tentei explicar no post acima. Você só se preocuparia com o formato da data, se o seu campo no SQL Server fosse do tipo texto (varchar, char, etc...). Se o seu campo é do tipo Data/Hora (DateTime, SmallDateTime), então a sua data não é guardada em forma de texto... É guardada no formato................. DateTime.

    Você só precisa formatar a data quando for LER as informações do banco de dados e for mostrar para o usuário, dentro do .NET.
     

    Em outras palavras, você não "escolhe" o formato da data no banco de dados... Você escolhe o formato que você quer MOSTRAR para o usuário, dentro da sua aplicação... 

    Abraços,
    Caio Proiete

     


    Caio Proiete
    Microsoft MVP, MCT, MCPD, MCTS, MCSD
    http://caioproiete.net

    quarta-feira, 3 de dezembro de 2008 18:36
    Moderador
  •  

    Tudo bem, mas houve outros inserts que migrei de Access para Sql Server em que as datas ficaram certas (dia-mes-ano) e para a data atual fica diferente (fica sem formatacao / formato sql server), isso nao vai dar confusao na base de dados, como posso organizar melhor isso? Tipo: numa tabela estah como dia mes ano e noutra mes dia ano?

     

    quarta-feira, 3 de dezembro de 2008 19:09
  •  

    Olá Magno,

    Isso só acontece se você estiver armazenando como TEXTO... Se o tipo do campo da tabela for DateTime ou SmallDateTime, então não existe o conceito de formato de data.

    Em outras palavras, se você está armazenando a data no formato DateTime ou SmallDateTime e está encontrando diferenças (datas com mm/dd e dd/mm) na hora de fazer o SELECT, então alguns registros foram inseridos incorretamente.

    Sugiro que você corrija a sua aplicação (para não formatar a data na hora de inserir, como mostrei acima), apague os registros da tabela e faça importação novamente.

    Abraços,
    Caio Proiete

     


    Caio Proiete
    Microsoft MVP, MCT, MCPD, MCTS, MCSD
    http://caioproiete.net

    quarta-feira, 3 de dezembro de 2008 19:23
    Moderador
  • Ola...

    Estou com um problema se não igual.. bem parecido.. estou com dificuldades de gravar uma data a partir de um DateTimePicker..

    No banco minha coluna é do tipo DateTime.

    Segue meu código:

    tb_dt_docto.Format = DateTimePickerFormat.Short
    tb_dt_ent.Format = DateTimePickerFormat.Short
    
    Private Sub incluir(ByVal inc As Integer)
    
            alteracao.Enabled = False
            lstb_pesq_cnpj.Enabled = False
            If valida() Then
    
                Dim conn As SqlConnection = New SqlConnection(My.Settings.faturasConnectionString.ToString())
                Dim sql As String = "INSERT INTO faturamento (cd_credenciado, nr_docto, dt_docto, vl_docto, dt_entrada) VALUES(@cred, @nrd, @dtd, @vl, @dte)"
                Dim cmd As New SqlCommand(sql, conn)
                cmd.Parameters.Add(New SqlParameter("@cred", tb_id_cred.Text))
                cmd.Parameters.Add(New SqlParameter("@nrd", tb_nr_docto.Text))
                cmd.Parameters.Add(New SqlParameter("@dtd", SqlDbType.SmallDateTime, tb_dt_docto.Text))
                cmd.Parameters.Add(New SqlParameter("@vl", tb_vl_docto.Text))
                cmd.Parameters.Add(New SqlParameter("@dte", SqlDbType.SmallDateTime, tb_dt_ent.Text))
    
                Try
                    conn.Open()
                    cmd.ExecuteNonQuery()
                    MsgBox("Fatura incluida com sucesso.")
                    limpaControles(Me)
                    lstb_pesq_cnpj.Enabled = False
                    inicio(inc)
    
                Catch ex As Exception
    
                    MsgBox(ex.Message)
    
                End Try
                lstb_pesq_cnpj.Enabled = True
            Else
                MsgBox("Dados incompletos.")
                lstb_pesq_cnpj.Enabled = True
    
            End If


    Recebo esta msg ao executar a otina:

    A conversão da seqüência de caracteres '21/09/2009' no tipo 'Integer' não é válida.

    O que estou errando??

    Sou novo nisso.. estou aprendendo.. a maioria dos erros consigo contornar lendo os foruns.. mas esse tah me quebrando as pernas.. rsrs
    segunda-feira, 21 de setembro de 2009 23:40
  • acho q consegui.. putz.. relutei em postar no forum essa pergunta.. naum deu 5 minutos me veio a luz.. (leitura... rsrs)

    cmd.Parameters.Add(New SqlParameter("@dtd", tb_dt_docto.Value.Date))
    cmd.Parameters.Add(New SqlParameter("@dte", tb_dt_ent.Value.Date))


    Está certo agora? está gravando normalmente e fazendo o update tbm...
    segunda-feira, 21 de setembro de 2009 23:57
  • Cara estou com o mesmo problema :,(  alguém pode me ajudar....?

    Private Sub CadastarProtocolo()
            Using con As SqlConnection = GetConnectionSQLServer()
                Try
                    con.Open()
                    Dim sql As String = "INSERT INTO TB_PROTOCOLO (N_PROTOCOLO, ATENDIMENTO, ID_SITUACAO, DATA, HORA, DATA_FECHAMENTO, HORA_FECHAMENTO, ID_CLIENTE, ID_DEPARTAMENTO, ID_CONTATO, ID_SISTEMA, ID_ASSUNTO, HISTORICO, ID_USUARIO)" _
                                      & " VALUES (@N_PROTOCOLO, @ATENDIMENTO, @ID_SITUACAO, CONVERT(DATE,'@DATA',103), CONVERT(TIME,'@HORA',108), CONVERT(DATE,'@DATA_FECHAMENTO',103) , CONVERT(TIME,'@HORA_FECHAMENTO',108), @ID_CLIENTE, @ID_DEPARTAMENTO, @ID_CONTATO, @ID_SISTEMA, @ID_ASSUNTO, @HISTORICO, @ID_USUARIO)"
                    Dim cmd As SqlCommand = New SqlCommand(sql, con)

                    Dim data, hora As Date
                    Dim atendimento As String

                    If rbtnAtivo.Checked = True And rbtnReceptivo.Checked = False Then
                        atendimento = "ATIVO"
                    ElseIf rbtnReceptivo.Checked = True And rbtnAtivo.Checked = False Then
                        atendimento = "RECEPTIVO"
                    Else
                        atendimento = ""
                    End If

                    If lblTipoStatus.Text = "N" Then
                        data = CDate(Now).ToString("dd/MM/yyyy")
                        hora = TimeOfDay.ToString("HH:mm:ss")
                    Else
                        data = ""
                        hora = ""
                    End If

                    cmd.Parameters.Add(New SqlParameter("@N_PROTOCOLO", SqlDbType.Char, 14, "N_PROTOCOLO"))
                    cmd.Parameters.Add(New SqlParameter("@ATENDIMENTO", SqlDbType.VarChar, 9, "ATENDIMENTO"))
                    cmd.Parameters.Add(New SqlParameter("@ID_SITUACAO", SqlDbType.Int)).Value = lblIDSituacao.Text
                    cmd.Parameters.Add(New SqlParameter("@DATA", SqlDbType.Date, "DATA"))
                    cmd.Parameters.Add(New SqlParameter("@HORA", SqlDbType.Time, "HORA"))
                    cmd.Parameters.Add(New SqlParameter("@DATA_FECHAMENTO", SqlDbType.Date, "DATA_FECHAMENTO"))
                    cmd.Parameters.Add(New SqlParameter("@HORA_FECHAMENTO", SqlDbType.Time, "HORA_FECHAMENTO"))
                    cmd.Parameters.Add(New SqlParameter("@ID_CLIENTE", SqlDbType.Int)).Value = lblIDEmpresa.Text
                    cmd.Parameters.Add(New SqlParameter("@ID_DEPARTAMENTO", SqlDbType.Int)).Value = lblIDDepartamento.Text
                    cmd.Parameters.Add(New SqlParameter("@ID_CONTATO", SqlDbType.Int)).Value = lblIDContato.Text
                    cmd.Parameters.Add(New SqlParameter("@ID_SISTEMA", SqlDbType.Int)).Value = lblIDSistema.Text
                    cmd.Parameters.Add(New SqlParameter("@ID_ASSUNTO", SqlDbType.Int)).Value = lblIDAssunto.Text
                    cmd.Parameters.Add(New SqlParameter("@HISTORICO", SqlDbType.VarChar, 255, "HISTORICO"))
                    cmd.Parameters.Add(New SqlParameter("@ID_USUARIO", SqlDbType.Int)).Value = lblAtendente.Text

                    cmd.Parameters("@N_PROTOCOLO").Value = txtNprotocolo.Text
                    cmd.Parameters("@ATENDIMENTO").Value = atendimento
                    cmd.Parameters("@DATA").Value = Convert.ToDateTime(txtData.Text)
                    cmd.Parameters("@HORA").Value = Convert.ToDateTime(txtHora.Text)
                    cmd.Parameters("@DATA_FECHAMENTO").Value = Convert.ToDateTime(data)
                    cmd.Parameters("@HORA_FECHAMENTO").Value = Convert.ToDateTime(hora)
                    cmd.Parameters("@HISTORICO").Value = txtInformacao.Text

                    cmd.ExecuteNonQuery()

                    MsgBox("REGISTRO SALVO COM SUCESSO...")

                Catch ex As Exception
                    MsgBox(ex.Message)
                Finally
                    con.Close()
                End Try
            End Using
        End Sub


    sexta-feira, 24 de junho de 2016 17:19